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;