summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--channels/chan_sip.c35
1 files changed, 24 insertions, 11 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 0c515a954..6d8e3e0e5 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -1923,6 +1923,7 @@ static int sip_cc_monitor_request_cc(struct ast_cc_monitor *monitor, int *availa
ast_get_ccnr_available_timer(monitor->interface->config_params);
sip_pvt_lock(monitor_instance->subscription_pvt);
+ ast_set_flag(&monitor_instance->subscription_pvt->flags[0], SIP_OUTGOING);
create_addr(monitor_instance->subscription_pvt, monitor_instance->peername, 0, 1, NULL);
ast_sip_ouraddrfor(&monitor_instance->subscription_pvt->sa, &monitor_instance->subscription_pvt->ourip, monitor_instance->subscription_pvt);
monitor_instance->subscription_pvt->subscribed = CALL_COMPLETION;
@@ -20005,6 +20006,27 @@ static void handle_response_notify(struct sip_pvt *p, int resp, const char *rest
/* \brief Handle SIP response in SUBSCRIBE transaction */
static void handle_response_subscribe(struct sip_pvt *p, int resp, const char *rest, struct sip_request *req, int seqno)
{
+ if (p->subscribed == CALL_COMPLETION) {
+ struct sip_monitor_instance *monitor_instance;
+
+ if (resp < 300) {
+ return;
+ }
+
+ /* Final failure response received. */
+ monitor_instance = ao2_callback(sip_monitor_instances, 0,
+ find_sip_monitor_instance_by_subscription_pvt, p);
+ if (monitor_instance) {
+ ast_cc_monitor_failed(monitor_instance->core_id,
+ monitor_instance->device_name,
+ "Received error response to our SUBSCRIBE");
+ }
+ return;
+ }
+
+ if (p->subscribed != MWI_NOTIFICATION) {
+ return;
+ }
if (!p->mwi) {
return;
}
@@ -20738,16 +20760,6 @@ static void handle_response(struct sip_pvt *p, int resp, const char *rest, struc
ast_string_field_set(p, theirtag, tag);
}
- if (sipmethod == SIP_SUBSCRIBE && resp >= 400) {
- struct sip_monitor_instance *monitor_instance = ao2_callback(sip_monitor_instances,
- 0, find_sip_monitor_instance_by_subscription_pvt, p);
- if (monitor_instance) {
- ast_cc_monitor_failed(monitor_instance->core_id, monitor_instance->device_name,
- "Received error response to our SUBSCRIBE");
- return;
- }
- }
-
switch(resp) {
case 200:
if (sipmethod == SIP_INVITE) {
@@ -23896,6 +23908,8 @@ static int handle_cc_subscribe(struct sip_pvt *p, struct sip_request *req)
*param_separator = '\0';
}
+ p->subscribed = CALL_COMPLETION;
+
if (!(agent = find_sip_cc_agent_by_subscribe_uri(uri))) {
if (!expires) {
/* Typically, if a 0 Expires reaches us and we can't find
@@ -23927,7 +23941,6 @@ static int handle_cc_subscribe(struct sip_pvt *p, struct sip_request *req)
agent_pvt->subscribe_pvt = dialog_ref(p, "SIP CC agent gains reference to subscription dialog");
ast_cc_agent_accept_request(agent->core_id, "SIP caller %s has requested CC via SUBSCRIBE",
agent->device_name);
- p->subscribed = CALL_COMPLETION;
/* We don't send a response here. That is done in the agent's ack callback or in the
* agent destructor, should a failure occur before we have responded