[sr-dev] git:master: modules/ims_charging: use cscf_get_public_identity_from_requri instead of msg->first_line.u. request.uri in mod.c and ims_charging.c

Richard Good richard.good at smilecoms.com
Thu Mar 6 10:18:38 CET 2014


Module: sip-router
Branch: master
Commit: 871ca61d1fac900b17d9c6857012e3bf90a71e1a
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=871ca61d1fac900b17d9c6857012e3bf90a71e1a

Author: Richard Good <richard.good at smilecoms.com>
Committer: Richard Good <richard.good at smilecoms.com>
Date:   Thu Mar  6 10:58:52 2014 +0200

modules/ims_charging: use cscf_get_public_identity_from_requri instead of msg->first_line.u.request.uri in mod.c and ims_charging.c
        When getting public identity from Req URI use ims_getters method instead of reading directly from message
        This allows ims_charging to identify subscribers to charge even when clients add extra info
        (e.g. phone context) after the identity in the request URI

---

 modules/ims_charging/ims_ro.c |    6 +++++-
 modules/ims_charging/mod.c    |   37 ++++++++++++++++++++++++++-----------
 2 files changed, 31 insertions(+), 12 deletions(-)

diff --git a/modules/ims_charging/ims_ro.c b/modules/ims_charging/ims_ro.c
index 650aad6..ae13389 100644
--- a/modules/ims_charging/ims_ro.c
+++ b/modules/ims_charging/ims_ro.c
@@ -944,6 +944,7 @@ int Ro_Send_CCR(struct sip_msg *msg, struct dlg_cell *dlg, int dir, str* charge_
     
     int cc_event_number = 0;						//According to IOT tests this should start at 0
     int cc_event_type = RO_CC_START;
+    int free_called_asserted_identity = 0;
 
     //getting asserted identity
     if ((asserted_identity = cscf_get_asserted_identity(msg, 0)).len == 0) {
@@ -955,7 +956,8 @@ int Ro_Send_CCR(struct sip_msg *msg, struct dlg_cell *dlg, int dir, str* charge_
     //getting called asserted identity
     if ((called_asserted_identity = cscf_get_called_party_id(msg, &h)).len == 0) {
 	    LM_DBG("No P-Called-Identity hdr found. Using request URI for called_asserted_identity");
-	    called_asserted_identity	= msg->first_line.u.request.uri;
+	    called_asserted_identity = cscf_get_public_identity_from_requri(msg);
+	    free_called_asserted_identity = 1;
     }
     
     if (dir == RO_ORIG_DIRECTION) {
@@ -1066,9 +1068,11 @@ int Ro_Send_CCR(struct sip_msg *msg, struct dlg_cell *dlg, int dir, str* charge_
 
     update_stat(initial_ccrs, 1);
 
+    if(free_called_asserted_identity)  shm_free(called_asserted_identity.s);// shm_malloc in cscf_get_public_identity_from_requri	
     return RO_RETURN_BREAK;
 
 error:
+    if(free_called_asserted_identity)  shm_free(called_asserted_identity.s);// shm_malloc in cscf_get_public_identity_from_requri	
     Ro_free_CCR(ro_ccr_data);
     if (cc_acc_session) {
         	cdpb.AAASessionsUnlock(cc_acc_session->hash);
diff --git a/modules/ims_charging/mod.c b/modules/ims_charging/mod.c
index e1256a1..4fb423f 100644
--- a/modules/ims_charging/mod.c
+++ b/modules/ims_charging/mod.c
@@ -324,6 +324,7 @@ static int w_ro_ccr(struct sip_msg *msg, str* route_name, str* direction, str* c
 	struct dlg_cell* dlg;
 	unsigned int len;
 	struct ro_session *ro_session = 0;
+	int free_contact = 0;
 	
 	LM_DBG("Ro CCR initiated: direction:%.*s, charge_type:%.*s, unit_type:%.*s, reservation_units:%i, route_name:%.*s",
 			direction->len, direction->s,
@@ -366,19 +367,24 @@ static int w_ro_ccr(struct sip_msg *msg, str* route_name, str* direction, str* c
 			goto send_ccr;
 		}
 		//get callee contact from request URI
-		contact	= msg->first_line.u.request.uri;
+		contact = cscf_get_public_identity_from_requri(msg);
+		free_contact = 1;
 	    
 	} else {
 	    LM_CRIT("don't know what to do in unknown mode - should we even get here\n");
-	    return RO_RETURN_ERROR;
+	    ret = RO_RETURN_ERROR;
+	    goto done;
 	}
 	
+	LM_DBG("IMPU data to pass to usrloc:  contact <%.*s> identity <%.*s>\n", contact.len, contact.s, identity.len, identity.s);
+	
 	//create impu_data_parcel
 	len = identity.len + contact.len +  sizeof (struct impu_data);
 	impu_data = (struct impu_data*) shm_malloc(len);
 	if (!impu_data) {
 	    LM_ERR("Unable to allocate memory for impu_data, trying to send CCR\n");
-	    return RO_RETURN_ERROR;
+	    ret = RO_RETURN_ERROR;
+	    goto done;
 	}
 	memset(impu_data, 0, len);
 	
@@ -398,19 +404,22 @@ static int w_ro_ccr(struct sip_msg *msg, str* route_name, str* direction, str* c
 	if (p != (((char*) impu_data) + len)) {
 	    LM_ERR("buffer overflow creating impu data, trying to send CCR\n");
 	    shm_free(impu_data);
-	    return RO_RETURN_ERROR;
+	    ret = RO_RETURN_ERROR;
+	    goto done;
 	}
 	
 	
 	//reg for callbacks on confirmed and terminated
 	if (dlgb.register_dlgcb(dlg, /* DLGCB_RESPONSE_FWDED */ DLGCB_CONFIRMED, add_dlg_data_to_contact, (void*)impu_data ,NULL ) != 0) {
 	    LM_CRIT("cannot register callback for dialog confirmation\n");
-	    return RO_RETURN_ERROR;
+	    ret = RO_RETURN_ERROR;
+	    goto done;
 	}
 
 	if (dlgb.register_dlgcb(dlg, DLGCB_TERMINATED | DLGCB_FAILED | DLGCB_EXPIRED /*| DLGCB_DESTROY */, remove_dlg_data_from_contact, (void*)impu_data, NULL ) != 0) {
 	    LM_CRIT("cannot register callback for dialog termination\n");
-	    return RO_RETURN_ERROR;
+	    ret = RO_RETURN_ERROR;
+	    goto done;
 	}
 	
 send_ccr:
@@ -429,13 +438,15 @@ send_ccr:
 	int ri = route_get(&main_rt, route_name->s);
 	if (ri < 0) {
 		LM_ERR("unable to find route block [%.*s]\n", route_name->len, route_name->s);
-		return RO_RETURN_ERROR;
+		ret = RO_RETURN_ERROR;
+		goto done;
 	}
 	
 	cfg_action = main_rt.rlist[ri];
 	if (!cfg_action) {
 		LM_ERR("empty action lists in route block [%.*s]\n", route_name->len, route_name->s);
-		return RO_RETURN_ERROR;
+		ret = RO_RETURN_ERROR;
+		goto done;
 	}
 
 	//before we send lets suspend the transaction
@@ -443,19 +454,22 @@ send_ccr:
 	if (t == NULL || t == T_UNDEFINED) {
 		if (tmb.t_newtran(msg) < 0) {
 			LM_ERR("cannot create the transaction for CCR async\n");
-			return RO_RETURN_ERROR;
+			ret = RO_RETURN_ERROR;
+			goto done;
 		}
 		t = tmb.t_gett();
 		if (t == NULL || t == T_UNDEFINED) {
 			LM_ERR("cannot lookup the transaction\n");
-			return RO_RETURN_ERROR;
+			ret = RO_RETURN_ERROR;
+			goto done;
 		}
 	}
 
 	LM_DBG("Suspending SIP TM transaction\n");
 	if (tmb.t_suspend(msg, &tindex, &tlabel) < 0) {
 		LM_ERR("failed to suspend the TM processing\n");
-		return RO_RETURN_ERROR;
+		ret =  RO_RETURN_ERROR;
+		goto done;
 	}
 	
 	ret = Ro_Send_CCR(msg, dlg, dir, charge_type, unit_type, reservation_units, cfg_action, tindex, tlabel);
@@ -466,6 +480,7 @@ send_ccr:
 	}
     
 done:
+	if(free_contact)  shm_free(contact.s);// shm_malloc in cscf_get_public_identity_from_requri	
 	return ret;
 }
 




More information about the sr-dev mailing list