[asterisk-commits] file: trunk r91458 - in /trunk: ./ main/udptl.c

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


Author: file
Date: Thu Dec  6 10:51:09 2007
New Revision: 91458

URL: http://svn.digium.com/view/asterisk?view=rev&rev=91458
Log:
Merged revisions 91450 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r91450 | file | 2007-12-06 12:49:42 -0400 (Thu, 06 Dec 2007) | 6 lines

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:
    trunk/   (props changed)
    trunk/main/udptl.c

Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-1.4-merged' - no diff available.

Modified: trunk/main/udptl.c
URL: http://svn.digium.com/view/asterisk/trunk/main/udptl.c?view=diff&rev=91458&r1=91457&r2=91458
==============================================================================
--- trunk/main/udptl.c (original)
+++ trunk/main/udptl.c Thu Dec  6 10:51:09 2007
@@ -118,7 +118,6 @@
 	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 @@
 					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;
@@ -367,23 +366,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
@@ -475,7 +457,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;
@@ -486,12 +468,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;
@@ -499,10 +486,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 --------------------------------------------------------*/
 
@@ -695,7 +684,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];
 }
@@ -804,7 +794,6 @@
 		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 @@
 
 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 @@
 		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 @@
 		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;




More information about the asterisk-commits mailing list