[svn-commits] rizzo: branch rizzo/astobj2 r47373 - /team/rizzo/astobj2/channels/chan_sip.c

svn-commits at lists.digium.com svn-commits at lists.digium.com
Thu Nov 9 09:19:05 MST 2006


Author: rizzo
Date: Thu Nov  9 10:19:05 2006
New Revision: 47373

URL: http://svn.digium.com/view/asterisk?view=rev&rev=47373
Log:
rename the "owner" field in a sip_pkt to "pvt", as it
is too confusing otherwise ("owner" is used to indicate a
channel in a nearby struct). Most of the usages are in a
single function.

Trunk candidate, definitely.

On passing note that __sip_ack(), when called by handle_response()
with resp == 491, does not free the packet, but because
the packet is not linked in the list anymore, this possibly
causes a memory leak. If not, it is a very obscure thing.

Need to consider this as a possible bug in trunk.


Modified:
    team/rizzo/astobj2/channels/chan_sip.c

Modified: team/rizzo/astobj2/channels/chan_sip.c
URL: http://svn.digium.com/view/asterisk/team/rizzo/astobj2/channels/chan_sip.c?view=diff&rev=47373&r1=47372&r2=47373
==============================================================================
--- team/rizzo/astobj2/channels/chan_sip.c (original)
+++ team/rizzo/astobj2/channels/chan_sip.c Thu Nov  9 10:19:05 2006
@@ -1056,7 +1056,7 @@
 	int method;				/*!< SIP method for this packet */
 	int seqno;				/*!< Sequence number */
 	unsigned int flags;			/*!< non-zero if this is a response packet (e.g. 200 OK) */
-	struct sip_pvt *owner;			/*!< Owner AST call */
+	struct sip_pvt *pvt;			/*!< Owner AST call */
 	int retransid;				/*!< Retransmission ID */
 	int timer_a;				/*!< SIP timer A, retransmission timer */
 	int timer_t1;				/*!< SIP Timer T1, estimated RTT or 500 ms */
@@ -1945,9 +1945,10 @@
 {
 	struct sip_pkt *pkt = data, *prev, *cur = NULL;
 	int reschedule = DEFAULT_RETRANS;
+	struct sip_pvt *pvt = pkt->pvt;	/* XXX we assume it is not null. maybe should check ? */
 
 	/* Lock channel PVT */
-	sip_pvt_lock(pkt->owner);
+	sip_pvt_lock(pvt);
 
 	if (pkt->retrans < MAX_RETRANS) {
 		pkt->retrans++;
@@ -1975,48 +1976,49 @@
  				ast_log(LOG_DEBUG, "** SIP timers: Rescheduling retransmission %d to %d ms (t1 %d ms (Retrans id #%d)) \n", pkt->retrans +1, siptimer_a, pkt->timer_t1, pkt->retransid);
  		} 
 
-		if (sip_debug_test_pvt(pkt->owner)) {
-			const struct sockaddr_in *dst = sip_real_dst(pkt->owner);
+		if (sip_debug_test_pvt(pkt->pvt)) {
+			const struct sockaddr_in *dst = sip_real_dst(pvt);
 			ast_verbose("Retransmitting #%d (%s) to %s:%d:\n%s\n---\n",
-				pkt->retrans, sip_nat_mode(pkt->owner),
+				pkt->retrans, sip_nat_mode(pvt),
 				ast_inet_ntoa(dst->sin_addr),
 				ntohs(dst->sin_port), pkt->data);
 		}
 
-		append_history(pkt->owner, "ReTx", "%d %s", reschedule, pkt->data);
-		__sip_xmit(pkt->owner, pkt->data, pkt->packetlen);
-		sip_pvt_unlock(pkt->owner);
+		append_history(pvt, "ReTx", "%d %s", reschedule, pkt->data);
+		__sip_xmit(pvt, pkt->data, pkt->packetlen);
+		sip_pvt_unlock(pvt);
 		return  reschedule;
 	} 
 	/* Too many retries */
-	if (pkt->owner && pkt->method != SIP_OPTIONS) {
+	if (pkt->method != SIP_OPTIONS) {
 		if (ast_test_flag(pkt, FLAG_FATAL) || sipdebug)	/* Tell us if it's critical or if we're debugging */
-			ast_log(LOG_WARNING, "Maximum retries exceeded on transmission %s for seqno %d (%s %s)\n", pkt->owner->callid, pkt->seqno, (ast_test_flag(pkt, FLAG_FATAL)) ? "Critical" : "Non-critical", (ast_test_flag(pkt, FLAG_RESPONSE)) ? "Response" : "Request");
+			ast_log(LOG_WARNING, "Maximum retries exceeded on transmission %s for seqno %d (%s %s)\n", pvt->callid, pkt->seqno, (ast_test_flag(pkt, FLAG_FATAL)) ? "Critical" : "Non-critical", (ast_test_flag(pkt, FLAG_RESPONSE)) ? "Response" : "Request");
 	} else {
 		if ((pkt->method == SIP_OPTIONS) && sipdebug)
-			ast_log(LOG_WARNING, "Cancelling retransmit of OPTIONs (call id %s) \n", pkt->owner->callid);
-	}
-	append_history(pkt->owner, "MaxRetries", "%s", (ast_test_flag(pkt, FLAG_FATAL)) ? "(Critical)" : "(Non-critical)");
+			ast_log(LOG_WARNING, "Cancelling retransmit of OPTIONs (call id %s) \n", pvt->callid);
+	}
+	append_history(pvt, "MaxRetries", "%s", (ast_test_flag(pkt, FLAG_FATAL)) ? "(Critical)" : "(Non-critical)");
  		
 	pkt->retransid = -1;
 
 	if (ast_test_flag(pkt, FLAG_FATAL)) {
 		/* the next call is unsafe, because we are called without dialoglock held,
-		 * and pkt->owner could disappear while we unlock it
+		 * and pvt could disappear while we unlock it
 		 */
-		lock_pvt_and_owner(pkt->owner, 0 /* try forever */);
-		if (pkt->owner->owner) {
-			ast_set_flag(&pkt->owner->flags[0], SIP_ALREADYGONE);
-			ast_log(LOG_WARNING, "Hanging up call %s - no reply to our critical packet.\n", pkt->owner->callid);
-			ast_queue_hangup(pkt->owner->owner);
-			ast_channel_unlock(pkt->owner->owner);
+		lock_pvt_and_owner(pvt, 0 /* try forever */);
+		if (pvt->owner) {
+			ast_set_flag(&pvt->flags[0], SIP_ALREADYGONE);
+			ast_log(LOG_WARNING, "Hanging up call %s - no reply to our critical packet.\n", pvt->callid);
+			ast_queue_hangup(pvt->owner);
+			ast_channel_unlock(pvt->owner);
 		} else {
 			/* If no channel owner, destroy now */
-			ast_set_flag(&pkt->owner->flags[0], SIP_NEEDDESTROY);	
-		}
-	}
+			ast_set_flag(&pvt->flags[0], SIP_NEEDDESTROY);	
+		}
+	}
+	/* XXX this code needs to be fixed */
 	/* In any case, go ahead and remove the packet */
-	for (prev = NULL, cur = pkt->owner->packets; cur; prev = cur, cur = cur->next) {
+	for (prev = NULL, cur = pvt->packets; cur; prev = cur, cur = cur->next) {
 		if (cur == pkt)
 			break;
 	}
@@ -2024,14 +2026,15 @@
 		if (prev)
 			prev->next = cur->next;
 		else
-			pkt->owner->packets = cur->next;
-		sip_pvt_unlock(pkt->owner);
+			pvt->packets = cur->next;
+		pkt->pvt = pvt_unref(pvt);	/* release the pvt */
+		sip_pvt_unlock(pvt);
 		free(cur);
 		pkt = NULL;
 	} else
 		ast_log(LOG_WARNING, "Weird, couldn't find packet owner!\n");
 	if (pkt)
-		sip_pvt_unlock(pkt->owner);
+		sip_pvt_unlock(pvt);
 	return 0;
 }
 
@@ -2049,7 +2052,7 @@
 	pkt->method = sipmethod;
 	pkt->packetlen = len;
 	pkt->next = p->packets;
-	pkt->owner = p;
+	pkt->pvt = pvt_ref(p);
 	pkt->seqno = seqno;
 	if (resp)
 		ast_set_flag(pkt, FLAG_RESPONSE);
@@ -2067,7 +2070,7 @@
 	pkt->next = p->packets;
 	p->packets = pkt;
 
-	__sip_xmit(pkt->owner, pkt->data, pkt->packetlen);	/* Send packet */
+	__sip_xmit(pkt->pvt, pkt->data, pkt->packetlen);	/* Send packet */
 	if (sipmethod == SIP_INVITE) {
 		/* Note this is a pending invite */
 		p->pendinginvite = seqno;
@@ -2167,6 +2170,8 @@
 					ast_log(LOG_DEBUG, "** SIP TIMER: Cancelling retransmit of packet (reply received) Retransid #%d\n", cur->retransid);
 				ast_sched_del(sched, cur->retransid);
 			}
+			if (cur->pvt)	/* XXX should be always */
+				cur->pvt = pvt_unref(cur->pvt);
 			if (!reset)
 				free(cur);
 			break;
@@ -12388,7 +12393,7 @@
 	if ((resp >= 100) && (resp <= 199))
 		__sip_semi_ack(p, seqno, 0, sipmethod);
 	else
-		__sip_ack(p, seqno, 0, sipmethod, resp == 491 ? TRUE : FALSE);
+		__sip_ack(p, seqno, 0, sipmethod, resp == 491 ? TRUE : FALSE);	/* XXX why true on 491 ? */
 
 	/* Get their tag if we haven't already */
 	if (ast_strlen_zero(p->theirtag) || (resp >= 200)) {



More information about the svn-commits mailing list