FreeCalypso > hg > themwi-system-sw
comparison mgw/gsm2pstn.c @ 199:e6c7ced3c031
mgw: accept zero-length RTP payload as BFI
Mainline OsmoBTS now has an option (rtp continuous-streaming)
that causes it to emit an RTP packet every 20 ms without gaps,
sending a BFI marker in the form of zero-length RTP payload
when it has nothing else to send. These codec-independent
BFI markers don't indicate TAF, but this provision is a good
start. Accept this BFI packet format in themwi-mgw.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Wed, 29 Mar 2023 20:23:43 -0800 |
parents | cf1ba5d65188 |
children | 0047c4c08d9e |
comparison
equal
deleted
inserted
replaced
198:cf1ba5d65188 | 199:e6c7ced3c031 |
---|---|
57 "GSM RTP ep got UDP packet from wrong source"); | 57 "GSM RTP ep got UDP packet from wrong source"); |
58 ep->g2p_err_flags |= ERR_WRONG_UDP_SRC; | 58 ep->g2p_err_flags |= ERR_WRONG_UDP_SRC; |
59 } | 59 } |
60 return; | 60 return; |
61 } | 61 } |
62 if (pktsize < RTP_PACKET_SIZE_BFI) { | 62 if (pktsize < RTP_PACKET_HDR_SIZE) { |
63 bad_rtp_pkt: if (!(ep->g2p_err_flags & ERR_BAD_RTP_PACKET)) { | 63 bad_rtp_pkt: if (!(ep->g2p_err_flags & ERR_BAD_RTP_PACKET)) { |
64 syslog(LOG_ERR, "Rx bad RTP packet on GSM side"); | 64 syslog(LOG_ERR, "Rx bad RTP packet on GSM side"); |
65 ep->g2p_err_flags |= ERR_BAD_RTP_PACKET; | 65 ep->g2p_err_flags |= ERR_BAD_RTP_PACKET; |
66 } | 66 } |
67 return; | 67 return; |
69 if (pkt.v_p_x_cc != 0x80) | 69 if (pkt.v_p_x_cc != 0x80) |
70 goto bad_rtp_pkt; | 70 goto bad_rtp_pkt; |
71 if ((pkt.m_pt & 0x7F) != ep->gsm_payload_type) | 71 if ((pkt.m_pt & 0x7F) != ep->gsm_payload_type) |
72 goto bad_rtp_pkt; | 72 goto bad_rtp_pkt; |
73 if (pktsize == ep->gsm_rtp_pkt_size && | 73 if (pktsize == ep->gsm_rtp_pkt_size && |
74 (pkt.payload[0] & 0xF0) == ep->gsm_payload_magic) | 74 (pkt.payload[0] & 0xF0) == ep->gsm_payload_magic) { |
75 bfi = 0; | 75 bfi = 0; |
76 else if (pktsize == RTP_PACKET_SIZE_BFI && pkt.payload[0] == 0xBF) { | 76 taf = 0; |
77 } else if (pktsize == RTP_PACKET_SIZE_BFI && pkt.payload[0] == 0xBF) { | |
77 bfi = 1; | 78 bfi = 1; |
78 taf = pkt.payload[1] & 1; | 79 taf = pkt.payload[1] & 1; |
80 } else if (pktsize == RTP_PACKET_HDR_SIZE) { | |
81 bfi = 1; | |
82 taf = 0; | |
79 } else | 83 } else |
80 goto bad_rtp_pkt; | 84 goto bad_rtp_pkt; |
81 if (ep->g2p_state && pkt.ssrc != ep->g2p_ssrc) { | 85 if (ep->g2p_state && pkt.ssrc != ep->g2p_ssrc) { |
82 if (!(ep->g2p_err_flags & ERR_SSRC_CHANGE)) { | 86 if (!(ep->g2p_err_flags & ERR_SSRC_CHANGE)) { |
83 syslog(LOG_ERR, "GSM RTP stream changed SSRC"); | 87 syslog(LOG_ERR, "GSM RTP stream changed SSRC"); |