Module: sip-router
Branch: admorten/sca
Commit: c29404ad8e9130d0989efee8bccddf1b6c0f2897
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=c29404a…
Author: Andrew Mortensen <admorten(a)isc.upenn.edu>
Committer: Andrew Mortensen <admorten(a)isc.upenn.edu>
Date: Mon Jul 22 00:42:18 2013 -0400
modules/sca: detect when an AoR is no longer SCA.
Don't, for example, create an appearance for callees that do not send
a Call-Info header, and whose AoR also has no subscribers.
---
modules/sca/sca_call_info.c | 27 +++++++++++++++++++++----
modules/sca/sca_subscribe.c | 44 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 66 insertions(+), 5 deletions(-)
diff --git a/modules/sca/sca_call_info.c b/modules/sca/sca_call_info.c
index 487baa4..5b6b2c7 100644
--- a/modules/sca/sca_call_info.c
+++ b/modules/sca/sca_call_info.c
@@ -1946,11 +1946,6 @@ sca_call_info_update( sip_msg_t *msg, char *p1, char *p2 )
/* reset rc to -1 so we don't end up returning 0 to the script */
rc = -1;
- if ( sca_call_info_header_remove( msg ) < 0 ) {
- LM_ERR( "Failed to remove Call-Info header" );
- return( -1 );
- }
-
/* reconcile mismatched Contact users and To/From URIs */
if ( msg->first_line.type == SIP_REQUEST ) {
if ( sca_create_canonical_aor( msg, &from_aor ) < 0 ) {
@@ -1982,6 +1977,28 @@ sca_call_info_update( sip_msg_t *msg, char *p1, char *p2 )
if ( sca_uri_is_shared_appearance( sca, &to_aor )) {
call_info.ua_shared |= SCA_CALL_INFO_SHARED_CALLEE;
}
+
+ if ( call_info_hdr == NULL ) {
+ if ( SCA_CALL_INFO_IS_SHARED_CALLER( &call_info ) &&
+ msg->first_line.type == SIP_REQUEST ) {
+ if ( !sca_subscription_aor_has_subscribers(
+ SCA_EVENT_TYPE_CALL_INFO, &from_aor )) {
+ call_info.ua_shared &= ~SCA_CALL_INFO_SHARED_CALLER;
+ }
+ } else if ( SCA_CALL_INFO_IS_SHARED_CALLEE( &call_info ) &&
+ msg->first_line.type == SIP_REPLY ) {
+ if ( !sca_subscription_aor_has_subscribers(
+ SCA_EVENT_TYPE_CALL_INFO, &to_aor )) {
+ call_info.ua_shared &= ~SCA_CALL_INFO_SHARED_CALLEE;
+ }
+ }
+ }
+
+ if ( sca_call_info_header_remove( msg ) < 0 ) {
+ LM_ERR( "Failed to remove Call-Info header" );
+ return( -1 );
+ }
+
if ( call_info.ua_shared == SCA_CALL_INFO_SHARED_NONE ) {
LM_DBG( "Neither %.*s nor %.*s are SCA AoRs",
STR_FMT( &from_aor ), STR_FMT( &to_aor ));
diff --git a/modules/sca/sca_subscribe.c b/modules/sca/sca_subscribe.c
index 1b8107e..7d34491 100644
--- a/modules/sca/sca_subscribe.c
+++ b/modules/sca/sca_subscribe.c
@@ -558,6 +558,50 @@ sca_subscription_db_update_timer( unsigned int ticks, void *param )
}
}
+ int
+sca_subscription_aor_has_subscribers( int event, str *aor )
+{
+ sca_hash_slot *slot;
+ sca_hash_entry *e;
+ sca_subscription *sub;
+ str sub_key = STR_NULL;
+ char *event_name;
+ int len;
+ int subscribers = 0;
+ int slot_idx = -1;
+
+ event_name = sca_event_name_from_type( event );
+ len = aor->len + strlen( event_name );
+ sub_key.s = (char *)pkg_malloc( len );
+ if ( sub_key.s == NULL ) {
+ LM_ERR( "Failed to pkg_malloc key to look up %s "
+ "subscription for %.*s", event_name, STR_FMT( aor ));
+ return( -1 );
+ }
+ SCA_STR_COPY( &sub_key, aor );
+ SCA_STR_APPEND_CSTR( &sub_key, event_name );
+
+ slot_idx = sca_hash_table_index_for_key( sca->subscriptions, &sub_key );
+ pkg_free( sub_key.s );
+ sub_key.len = 0;
+
+ slot = sca_hash_table_slot_for_index( sca->subscriptions, slot_idx );
+ sca_hash_table_lock_index( sca->subscriptions, slot_idx );
+
+ for ( e = slot->entries; e != NULL; e = e->next ) {
+ sub = (sca_subscription *)e->value;
+
+ if ( SCA_STR_EQ( &sub->target_aor, aor )) {
+ subscribers = 1;
+ break;
+ }
+ }
+
+ sca_hash_table_unlock_index( sca->subscriptions, slot_idx );
+
+ return( subscribers );
+}
+
sca_subscription *
sca_subscription_create( str *aor, int event, str *subscriber,
unsigned int notify_cseq, unsigned int subscribe_cseq, int expire_delta,