[asterisk-commits] file: branch 1.4 r91450 - /branches/1.4/main/udptl.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Thu Dec 6 10:49:43 CST 2007


Author: file
Date: Thu Dec  6 10:49:42 2007
New Revision: 91450

URL: http://svn.digium.com/view/asterisk?view=rev&rev=91450
Log:
Fix various in the udptl implementation. It could return empty modem frames, have an incorrect sequence number on packets, and display the wrong sequence number in the debug messages.
(closes issue #11228)
Reported by: Cache
Patches:
      udptl-4.patch uploaded by dimas (license 88)

Modified:
    branches/1.4/main/udptl.c

Modified: branches/1.4/main/udptl.c
URL: http://svn.digium.com/view/asterisk/branches/1.4/main/udptl.c?view=diff&rev=91450&r1=91449&r2=91450
==============================================================================
--- branches/1.4/main/udptl.c (original)
+++ branches/1.4/main/udptl.c Thu Dec  6 10:49:42 2007
@@ -98,7 +98,6 @@
 	struct sockaddr_in us;
 	struct sockaddr_in them;
 	int *ioid;
-	uint16_t seqno;
 	struct sched_context *sched;
 	struct io_context *io;
 	void *data;
@@ -336,7 +335,7 @@
 					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;
@@ -347,23 +346,6 @@
 					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 = 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
@@ -455,7 +437,7 @@
 				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;
@@ -466,12 +448,17 @@
 				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;
@@ -479,10 +466,12 @@
 		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 --------------------------------------------------------*/
 
@@ -675,7 +664,8 @@
 #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];
 }
@@ -784,7 +774,6 @@
 		udptl->tx[i].buf_len = -1;
 	}
 
-	udptl->seqno = ast_random() & 0xffff;
 	udptl->them.sin_family = AF_INET;
 	udptl->us.sin_family = AF_INET;
 
@@ -882,6 +871,7 @@
 
 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];
@@ -898,6 +888,9 @@
 		ast_log(LOG_WARNING, "UDPTL can only send T.38 data\n");
 		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);
@@ -911,7 +904,7 @@
 		if (udptl_debug_test_addr(&s->them))
 			ast_verbose("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;




More information about the asterisk-commits mailing list