Module: sip-router
Branch: admorten/sca
Commit: b906a1e4c3d36a8dd007dabd1934c7a625ffdd6a
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=b906a1e4c3d36a8dd007dabd1934c7a625ffdd6a

Author: Andrew Mortensen <[email protected]>
Committer: Andrew Mortensen <[email protected]>
Date:   Thu Apr 11 22:34:10 2013 -0400

modules/sca: clear appearance on t_reply with error after receiving 18x.

- Receiving a 18x provisional reply triggers line-seize subscription
  termination. Releasing the seized appearance while processing a t_reply
  with an error status *after* getting a 18x would fail because
  sca_subscription_terminate could not find a matching line-seize
  subscription. In that case, look up appearance by tags and release it.

---

 modules/sca/sca_call_info.c |   33 ++++++++++++++++++++++++++++-----
 modules/sca/sca_subscribe.c |    8 +++++++-
 2 files changed, 35 insertions(+), 6 deletions(-)

diff --git a/modules/sca/sca_call_info.c b/modules/sca/sca_call_info.c
index 8f681fd..6766553 100644
--- a/modules/sca/sca_call_info.c
+++ b/modules/sca/sca_call_info.c
@@ -877,8 +877,10 @@ sca_call_info_local_error_reply_handler( sip_msg_t *msg, 
int status )
 {
     struct to_body     *from;
     struct to_body     *to;
+    sca_appearance     *app;
     str                        aor = STR_NULL;
     str                        contact_uri = STR_NULL;
+    int                        rc;
 
     if ( sca_get_msg_from_header( msg, &from ) < 0 ) {
        LM_ERR( "sca_call_info_sl_reply_cb: failed to get From header from "
@@ -909,15 +911,36 @@ sca_call_info_local_error_reply_handler( sip_msg_t *msg, 
int status )
        return;
     }
 
-    if ( sca_subscription_terminate( sca, &aor,
+    /*
+     * two typical cases to handle. in the first case, we haven't dropped
+     * our line-seize subscription because a transaction exists but we
+     * never got a provisional 18x response before calling t_reply. calling
+     * sca_subscription_terminate will drop the subscription and release
+     * the seized appearance.
+     *
+     * in the second case, we got a 18x response and terminated the
+     * line-seize subscription, so we need to look up the appearance by
+     * tags in order to release it.
+     */
+    rc = sca_subscription_terminate( sca, &aor,
                SCA_EVENT_TYPE_LINE_SEIZE, &contact_uri,
                SCA_SUBSCRIPTION_STATE_TERMINATED_NORESOURCE,
-               SCA_SUBSCRIPTION_TERMINATE_OPT_DEFAULT ) < 0 ) {
+               SCA_SUBSCRIPTION_TERMINATE_OPT_DEFAULT );
+    if ( rc < 0 ) {
        LM_ERR( "sca_call_info_sl_reply_cb: failed to terminate "
                "line-seize subscription for %.*s", STR_FMT( &contact_uri ));
-    } else if ( sca_notify_call_info_subscribers( sca, &aor ) < 0 ) {
-       LM_ERR( "Failed to call-info NOTIFY %.*s subscribers",
-               STR_FMT( &aor ));
+    } else if ( rc == 0 ) {
+       /* no line-seize subscription found */
+       app = sca_appearance_unlink_by_tags( sca, &aor,
+                   &msg->callid->body, &from->tag_value, &to->tag_value );
+       if ( app ) {
+           sca_appearance_free( app );
+           if ( sca_notify_call_info_subscribers( sca, &aor ) < 0 ) {
+               LM_ERR( "sca_call_info_local_error_reply: failed to send "
+                       "call-info NOTIFY to %.*s subscribers",
+                       STR_FMT( &aor ));
+           }
+       }
     }
 }
 
diff --git a/modules/sca/sca_subscribe.c b/modules/sca/sca_subscribe.c
index f30386a..d62e7bf 100644
--- a/modules/sca/sca_subscribe.c
+++ b/modules/sca/sca_subscribe.c
@@ -1350,6 +1350,12 @@ sca_subscription_reply( sca_mod *scam, int status_code, 
char *status_msg,
     return( sca_reply( scam, status_code, status_msg, &extra_headers, msg ));
 }
 
+/*
+ * return values:
+ *     -1: error
+ *      0: no subscription found to terminate
+ *      1: subscription terminated
+ */
     int
 sca_subscription_terminate( sca_mod *scam, str *aor, int event,
        str *subscriber, int termination_state, int opts )
@@ -1395,7 +1401,7 @@ sca_subscription_terminate( sca_mod *scam, str *aor, int 
event,
     if ( ent == NULL ) {
        LM_DBG( "No %s subscription for %.*s", event_name,
                STR_FMT( subscriber ));
-       return( 1 );
+       return( 0 );
     }
 
     sub = (sca_subscription *)ent->value;


_______________________________________________
sr-dev mailing list
[email protected]
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to