aboutsummaryrefslogtreecommitdiffstats
path: root/channels/chan_sip.c
diff options
context:
space:
mode:
Diffstat (limited to 'channels/chan_sip.c')
-rw-r--r--channels/chan_sip.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index b2c4c77c0..f207d4c26 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -1238,7 +1238,7 @@ static void sip_scheddestroy(struct sip_pvt *p, int ms);
static void sip_cancel_destroy(struct sip_pvt *p);
static void sip_destroy(struct sip_pvt *p);
static void __sip_destroy(struct sip_pvt *p, int lockowner);
-static void __sip_ack(struct sip_pvt *p, int seqno, int resp, int sipmethod, int reset);
+static void __sip_ack(struct sip_pvt *p, int seqno, int resp, int sipmethod);
static void __sip_pretend_ack(struct sip_pvt *p);
static int __sip_semi_ack(struct sip_pvt *p, int seqno, int resp, int sipmethod);
static int auto_congest(void *nothing);
@@ -2005,7 +2005,7 @@ static void sip_cancel_destroy(struct sip_pvt *p)
}
/*! \brief Acknowledges receipt of a packet and stops retransmission */
-static void __sip_ack(struct sip_pvt *p, int seqno, int resp, int sipmethod, int reset)
+static void __sip_ack(struct sip_pvt *p, int seqno, int resp, int sipmethod)
{
struct sip_pkt *cur, *prev = NULL;
@@ -2033,8 +2033,7 @@ static void __sip_ack(struct sip_pvt *p, int seqno, int resp, int sipmethod, int
ast_log(LOG_DEBUG, "** SIP TIMER: Cancelling retransmit of packet (reply received) Retransid #%d\n", cur->retransid);
ast_sched_del(sched, cur->retransid);
}
- if (!reset)
- free(cur);
+ free(cur);
break;
}
}
@@ -2057,7 +2056,7 @@ static void __sip_pretend_ack(struct sip_pvt *p)
}
cur = p->packets;
method = (cur->method) ? cur->method : find_sip_method(cur->data);
- __sip_ack(p, cur->seqno, ast_test_flag(cur, FLAG_RESPONSE), method, FALSE);
+ __sip_ack(p, cur->seqno, ast_test_flag(cur, FLAG_RESPONSE), method);
}
}
@@ -11613,9 +11612,13 @@ static void handle_response_invite(struct sip_pvt *p, int resp, char *rest, stru
break;
case 491: /* Pending */
- /* we have to wait a while, then retransmit */
- /* Transmission is rescheduled, so everything should be taken care of.
- We should support the retry-after at some point */
+ /* we really should have to wait a while, then retransmit */
+ /* We should support the retry-after at some point */
+ /* At this point, we treat this as a congestion */
+ transmit_request(p, SIP_ACK, seqno, XMIT_UNRELIABLE, FALSE);
+ if (p->owner && !ast_test_flag(req, SIP_PKT_IGNORE))
+ ast_queue_control(p->owner, AST_CONTROL_CONGESTION);
+ ast_set_flag(&p->flags[0], SIP_NEEDDESTROY);
break;
case 501: /* Not implemented */
@@ -11887,7 +11890,7 @@ static void handle_response(struct sip_pvt *p, int resp, char *rest, struct sip_
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);
/* Get their tag if we haven't already */
if (ast_strlen_zero(p->theirtag) || (resp >= 200)) {
@@ -14379,7 +14382,7 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc
/* Make sure we don't ignore this */
if (seqno == p->pendinginvite) {
p->pendinginvite = 0;
- __sip_ack(p, seqno, FLAG_RESPONSE, 0, FALSE);
+ __sip_ack(p, seqno, FLAG_RESPONSE, 0);
if (find_sdp(req)) {
if (process_sdp(p, req))
return -1;