comparison mgw/gsm2pstn.c @ 169:648a64b2e16b

mgw: accept Themyscira-extension RTP BFI packets
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 19 Nov 2022 23:08:49 -0800
parents 8c28426abef0
children a6eb2de277f6
comparison
equal deleted inserted replaced
168:8c28426abef0 169:648a64b2e16b
35 struct endpoint *ep; 35 struct endpoint *ep;
36 { 36 {
37 struct rtp_packet pkt; 37 struct rtp_packet pkt;
38 struct sockaddr_in sin_from; 38 struct sockaddr_in sin_from;
39 socklen_t addrlen; 39 socklen_t addrlen;
40 unsigned pktsize;
40 int16_t seq_delta; 41 int16_t seq_delta;
41 int32_t ts_delta; 42 int32_t ts_delta;
42 int16_t pcm_samples[SAMPLES_PER_FRAME]; 43 int16_t pcm_samples[SAMPLES_PER_FRAME];
43 int rc, m_out; 44 int rc, bfi, taf, m_out;
44 45
45 addrlen = sizeof(struct sockaddr_in); 46 addrlen = sizeof(struct sockaddr_in);
46 rc = recvfrom(in_fd, &pkt, sizeof pkt, 0, 47 rc = recvfrom(in_fd, &pkt, sizeof pkt, 0,
47 (struct sockaddr *) &sin_from, &addrlen); 48 (struct sockaddr *) &sin_from, &addrlen);
48 if (rc < 0) 49 if (rc < 0)
49 return; 50 return;
51 pktsize = rc;
50 if (sin_from.sin_addr.s_addr != ep->rtp_gsm.remote_addr.sin_addr.s_addr 52 if (sin_from.sin_addr.s_addr != ep->rtp_gsm.remote_addr.sin_addr.s_addr
51 || sin_from.sin_port != ep->rtp_gsm.remote_addr.sin_port) { 53 || sin_from.sin_port != ep->rtp_gsm.remote_addr.sin_port) {
52 if (!(ep->g2p_err_flags & ERR_WRONG_UDP_SRC)) { 54 if (!(ep->g2p_err_flags & ERR_WRONG_UDP_SRC)) {
53 syslog(LOG_ERR, 55 syslog(LOG_ERR,
54 "GSM RTP ep got UDP packet from wrong source"); 56 "GSM RTP ep got UDP packet from wrong source");
55 ep->g2p_err_flags |= ERR_WRONG_UDP_SRC; 57 ep->g2p_err_flags |= ERR_WRONG_UDP_SRC;
56 } 58 }
57 return; 59 return;
58 } 60 }
59 if (rc != ep->gsm_rtp_pkt_size) { 61 if (pktsize < RTP_PACKET_SIZE_BFI) {
60 bad_rtp_pkt: if (!(ep->g2p_err_flags & ERR_BAD_RTP_PACKET)) { 62 bad_rtp_pkt: if (!(ep->g2p_err_flags & ERR_BAD_RTP_PACKET)) {
61 syslog(LOG_ERR, "Rx bad RTP packet on GSM side"); 63 syslog(LOG_ERR, "Rx bad RTP packet on GSM side");
62 ep->g2p_err_flags |= ERR_BAD_RTP_PACKET; 64 ep->g2p_err_flags |= ERR_BAD_RTP_PACKET;
63 } 65 }
64 return; 66 return;
65 } 67 }
66 if (pkt.v_p_x_cc != 0x80) 68 if (pkt.v_p_x_cc != 0x80)
67 goto bad_rtp_pkt; 69 goto bad_rtp_pkt;
68 if ((pkt.m_pt & 0x7F) != ep->gsm_payload_type) 70 if ((pkt.m_pt & 0x7F) != ep->gsm_payload_type)
69 goto bad_rtp_pkt; 71 goto bad_rtp_pkt;
70 if ((pkt.payload[0] & 0xF0) != ep->gsm_payload_magic) 72 if (pktsize == ep->gsm_rtp_pkt_size &&
73 (pkt.payload[0] & 0xF0) == ep->gsm_payload_magic)
74 bfi = 0;
75 else if (pktsize == RTP_PACKET_SIZE_BFI && pkt.payload[0] == 0xBF) {
76 bfi = 1;
77 taf = pkt.payload[1] & 1;
78 } else
71 goto bad_rtp_pkt; 79 goto bad_rtp_pkt;
72 if (ep->g2p_state && pkt.ssrc != ep->g2p_ssrc) { 80 if (ep->g2p_state && pkt.ssrc != ep->g2p_ssrc) {
73 if (!(ep->g2p_err_flags & ERR_SSRC_CHANGE)) { 81 if (!(ep->g2p_err_flags & ERR_SSRC_CHANGE)) {
74 syslog(LOG_ERR, "GSM RTP stream changed SSRC"); 82 syslog(LOG_ERR, "GSM RTP stream changed SSRC");
75 ep->g2p_err_flags |= ERR_SSRC_CHANGE; 83 ep->g2p_err_flags |= ERR_SSRC_CHANGE;
132 else 140 else
133 m_out = 1; 141 m_out = 1;
134 } 142 }
135 switch (ep->gsm_payload_msg_type) { 143 switch (ep->gsm_payload_msg_type) {
136 case GSM_TCHF_FRAME: 144 case GSM_TCHF_FRAME:
137 gsmfr_preproc_good_frame(ep->gsm_decoder_extra_state, 145 if (bfi)
138 pkt.payload); 146 gsmfr_preproc_bfi(ep->gsm_decoder_extra_state, taf,
147 pkt.payload);
148 else
149 gsmfr_preproc_good_frame(ep->gsm_decoder_extra_state,
150 pkt.payload);
139 gsm_decode(ep->gsm_decoder_state, pkt.payload, pcm_samples); 151 gsm_decode(ep->gsm_decoder_state, pkt.payload, pcm_samples);
140 break; 152 break;
141 } 153 }
142 pkt.m_pt = ep->pstn_payload_type; 154 pkt.m_pt = ep->pstn_payload_type;
143 if (m_out) 155 if (m_out)