|
|
|
|
@ -554,6 +554,7 @@ static void __fec_save(struct t38_gateway *tg, const str *piece, uint16_t seq) {
|
|
|
|
|
|
|
|
|
|
int t38_gateway_input_udptl(struct t38_gateway *tg, const str *buf) {
|
|
|
|
|
const char *err = NULL;
|
|
|
|
|
struct udptl_packet *up = NULL;
|
|
|
|
|
|
|
|
|
|
if (!tg)
|
|
|
|
|
return 0;
|
|
|
|
|
@ -582,7 +583,7 @@ int t38_gateway_input_udptl(struct t38_gateway *tg, const str *buf) {
|
|
|
|
|
|
|
|
|
|
ilog(LOG_DEBUG, "Received primary IFP packet, len %i, seq %i", piece.len, seq);
|
|
|
|
|
str primary = piece;
|
|
|
|
|
struct udptl_packet *up = __make_udptl_packet(&primary, seq);
|
|
|
|
|
up = __make_udptl_packet(&primary, seq);
|
|
|
|
|
|
|
|
|
|
err = "Error correction mode byte missing";
|
|
|
|
|
if (str_shift_ret(&s, 1, &piece))
|
|
|
|
|
@ -591,6 +592,14 @@ int t38_gateway_input_udptl(struct t38_gateway *tg, const str *buf) {
|
|
|
|
|
|
|
|
|
|
mutex_lock(&tg->lock);
|
|
|
|
|
|
|
|
|
|
long diff = seq - up->p.seq;
|
|
|
|
|
if (diff > 100 || diff < -100) {
|
|
|
|
|
ilog(LOG_INFO | LOG_FLAG_LIMIT, "Ignoring UDPTL packet with wildly off seq (%u <> %u)",
|
|
|
|
|
(unsigned int) seq, (unsigned int) up->p.seq);
|
|
|
|
|
err = NULL;
|
|
|
|
|
goto err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// XXX possible short path here without going through the sequencer
|
|
|
|
|
int ret = packet_sequencer_insert(&tg->sequencer, &up->p);
|
|
|
|
|
if (ret < 0) {
|
|
|
|
|
@ -743,6 +752,8 @@ out:
|
|
|
|
|
err:
|
|
|
|
|
if (err)
|
|
|
|
|
ilog(LOG_ERR | LOG_FLAG_LIMIT, "Failed to process UDPTL/T.38/IFP packet: %s", err);
|
|
|
|
|
if (up)
|
|
|
|
|
__udptl_packet_free(up);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|