summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--main/udptl.c47
1 files changed, 20 insertions, 27 deletions
diff --git a/main/udptl.c b/main/udptl.c
index 8ae65b9e6..f14502c71 100644
--- a/main/udptl.c
+++ b/main/udptl.c
@@ -118,7 +118,6 @@ struct ast_udptl {
struct sockaddr_in us;
struct sockaddr_in them;
int *ioid;
- uint16_t seqno;
struct sched_context *sched;
struct io_context *io;
void *data;
@@ -356,7 +355,7 @@ static int udptl_rx_packet(struct ast_udptl *s, uint8_t *buf, int len)
s->f[ifp_no].subclass = AST_MODEM_T38;
s->f[ifp_no].mallocd = 0;
- //s->f[ifp_no].???seq_no = seq_no - i;
+ s->f[ifp_no].seqno = seq_no - i;
s->f[ifp_no].datalen = lengths[i - 1];
s->f[ifp_no].data = (uint8_t *) bufs[i - 1];
s->f[ifp_no].offset = 0;
@@ -368,23 +367,6 @@ static int udptl_rx_packet(struct ast_udptl *s, uint8_t *buf, int len)
}
}
}
- /* If packets are received out of sequence, we may have already processed this packet from the error
- recovery information in a packet already received. */
- if (seq_no >= s->rx_seq_no) {
- /* Decode the primary IFP packet */
- s->f[ifp_no].frametype = AST_FRAME_MODEM;
- s->f[ifp_no].subclass = AST_MODEM_T38;
-
- s->f[ifp_no].mallocd = 0;
- //s->f[ifp_no].???seq_no = seq_no;
- s->f[ifp_no].datalen = ifp_len;
- s->f[ifp_no].data = (uint8_t *) ifp;
- s->f[ifp_no].offset = 0;
- s->f[ifp_no].src = "UDPTL";
- if (ifp_no > 0)
- AST_LIST_NEXT(&s->f[ifp_no - 1], frame_list) = &s->f[ifp_no];
- AST_LIST_NEXT(&s->f[ifp_no], frame_list) = NULL;
- }
}
else
{
@@ -475,7 +457,7 @@ static int udptl_rx_packet(struct ast_udptl *s, uint8_t *buf, int len)
s->f[ifp_no].subclass = AST_MODEM_T38;
s->f[ifp_no].mallocd = 0;
- //s->f[ifp_no].???seq_no = j;
+ s->f[ifp_no].seqno = j;
s->f[ifp_no].datalen = s->rx[l].buf_len;
s->f[ifp_no].data = s->rx[l].buf;
s->f[ifp_no].offset = 0;
@@ -486,12 +468,17 @@ static int udptl_rx_packet(struct ast_udptl *s, uint8_t *buf, int len)
ifp_no++;
}
}
+ }
+
+ /* If packets are received out of sequence, we may have already processed this packet from the error
+ recovery information in a packet already received. */
+ if (seq_no >= s->rx_seq_no) {
/* Decode the primary IFP packet */
s->f[ifp_no].frametype = AST_FRAME_MODEM;
s->f[ifp_no].subclass = AST_MODEM_T38;
-
+
s->f[ifp_no].mallocd = 0;
- //s->f[ifp_no].???seq_no = j;
+ s->f[ifp_no].seqno = seq_no;
s->f[ifp_no].datalen = ifp_len;
s->f[ifp_no].data = (uint8_t *) ifp;
s->f[ifp_no].offset = 0;
@@ -499,10 +486,12 @@ static int udptl_rx_packet(struct ast_udptl *s, uint8_t *buf, int len)
if (ifp_no > 0)
AST_LIST_NEXT(&s->f[ifp_no - 1], frame_list) = &s->f[ifp_no];
AST_LIST_NEXT(&s->f[ifp_no], frame_list) = NULL;
+
+ ifp_no++;
}
s->rx_seq_no = seq_no + 1;
- return 0;
+ return ifp_no;
}
/*- End of function --------------------------------------------------------*/
@@ -695,7 +684,8 @@ struct ast_frame *ast_udptl_read(struct ast_udptl *udptl)
#if 0
printf("Got UDPTL packet from %s:%d (seq %d, len = %d)\n", ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port), seqno, res);
#endif
- udptl_rx_packet(udptl, udptl->rawdata + AST_FRIENDLY_OFFSET, res);
+ if (udptl_rx_packet(udptl, udptl->rawdata + AST_FRIENDLY_OFFSET, res) < 1)
+ return &ast_null_frame;
return &udptl->f[0];
}
@@ -804,7 +794,6 @@ struct ast_udptl *ast_udptl_new_with_bindaddr(struct sched_context *sched, struc
udptl->tx[i].buf_len = -1;
}
- udptl->seqno = ast_random() & 0xffff;
udptl->them.sin_family = AF_INET;
udptl->us.sin_family = AF_INET;
@@ -898,6 +887,7 @@ void ast_udptl_destroy(struct ast_udptl *udptl)
int ast_udptl_write(struct ast_udptl *s, struct ast_frame *f)
{
+ int seq;
int len;
int res;
uint8_t buf[LOCAL_FAX_MAX_DATAGRAM];
@@ -915,6 +905,9 @@ int ast_udptl_write(struct ast_udptl *s, struct ast_frame *f)
return -1;
}
+ /* Save seq_no for debug output because udptl_build_packet increments it */
+ seq = s->tx_seq_no & 0xFFFF;
+
/* Cook up the UDPTL packet, with the relevant EC info. */
len = udptl_build_packet(s, buf, f->data, f->datalen);
@@ -925,9 +918,9 @@ int ast_udptl_write(struct ast_udptl *s, struct ast_frame *f)
printf("Sent %d bytes of UDPTL data to %s:%d\n", res, ast_inet_ntoa(udptl->them.sin_addr), ntohs(udptl->them.sin_port));
#endif
if (udptl_debug_test_addr(&s->them))
- ast_verbose("Sent UDPTL packet to %s:%d (type %d, seq %d, len %d)\n",
+ ast_verb(1, "Sent UDPTL packet to %s:%d (type %d, seq %d, len %d)\n",
ast_inet_ntoa(s->them.sin_addr),
- ntohs(s->them.sin_port), 0, s->seqno, len);
+ ntohs(s->them.sin_port), 0, seq, len);
}
return 0;