FreeCalypso > hg > themwi-system-sw
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) |