[sr-dev] git:master: lib/ims/ims_getters: Changed cscf_get_called_party_id to cscf_get_public_identity_from_called_party_id

Richard Good richard.good at smilecoms.com
Fri Mar 7 10:09:16 CET 2014


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

Author: Richard Good <richard.good at smilecoms.com>
Committer: Richard Good <richard.good at smilecoms.com>
Date:   Fri Mar  7 11:07:11 2014 +0200

lib/ims/ims_getters: Changed cscf_get_called_party_id to cscf_get_public_identity_from_called_party_id
	Changed function to get identity from called part id header instead of full header
	Fixes clients that attach extra info (e.g. phone-context)
	Changed references to this method in ims_charging and ims_registrar_pcscf

---

 lib/ims/ims_getters.c                        |   20 ++++++++++++++++++--
 lib/ims/ims_getters.h                        |    4 ++--
 modules/ims_charging/ims_ro.c                |    2 +-
 modules/ims_charging/mod.c                   |    2 +-
 modules/ims_registrar_pcscf/service_routes.c |    2 +-
 5 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/lib/ims/ims_getters.c b/lib/ims/ims_getters.c
index aa37c7d..eb266e8 100644
--- a/lib/ims/ims_getters.c
+++ b/lib/ims/ims_getters.c
@@ -1494,15 +1494,19 @@ int cscf_get_cseq(struct sip_msg *msg,struct hdr_field **hr)
 
 static str s_called_party_id={"P-Called-Party-ID",17};
 /**
- * Looks for the P-Called-Party-ID header and extracts its content.
+ * Looks for the P-Called-Party-ID header and extracts the public identity from it
  * @param msg - the sip message
  * @param hr - ptr to return the found hdr_field 
  * @returns the P-Called_Party-ID
  */
-str cscf_get_called_party_id(struct sip_msg *msg,struct hdr_field **hr)
+str cscf_get_public_identity_from_called_party_id(struct sip_msg *msg,struct hdr_field **hr)
 {
 	str id={0,0};
 	struct hdr_field *h;
+	int after_semi_colon=0;
+	int len=0;
+	int i=0;
+	
 	if (hr) *hr=0;
 	if (!msg) return id;
 	if (parse_headers(msg, HDR_EOH_F, 0)<0) {
@@ -1522,6 +1526,18 @@ str cscf_get_called_party_id(struct sip_msg *msg,struct hdr_field **hr)
 			while(id.len && (id.s[id.len-1]==' ' || id.s[id.len-1]=='\t' || id.s[id.len-1]=='>')){
 				id.len--;
 			}	
+			//get only text in front of ';' there might not even be a semi-colon
+			//this caters for extra information after the public identity - e.g. phone-context
+			len= id.len;
+			for(i=0; i<len;i++) {
+			    if(id.s[i]==';'){
+				//found semi-colon
+				after_semi_colon = 1;
+			    }
+			    if(after_semi_colon){
+				id.len--;
+			    }
+			}
 			if (hr) *hr = h;
 			return id;
 		}
diff --git a/lib/ims/ims_getters.h b/lib/ims/ims_getters.h
index 2217ddc..aeeb591 100644
--- a/lib/ims/ims_getters.h
+++ b/lib/ims/ims_getters.h
@@ -420,12 +420,12 @@ int cscf_add_header_rpl(struct sip_msg *msg, str *hdr);
 int cscf_get_cseq(struct sip_msg *msg,struct hdr_field **hr);
 
 /**
- * Looks for the P-Called-Party-ID header and extracts its content.
+ * Looks for the P-Called-Party-ID header and extracts the public identity from it
  * @param msg - the sip message
  * @param hr - ptr to return the found hdr_field 
  * @returns the P-Called_Party-ID
  */
-str cscf_get_called_party_id(struct sip_msg *msg,struct hdr_field **hr);
+str cscf_get_public_identity_from_called_party_id(struct sip_msg *msg,struct hdr_field **hr);
 
 #endif
 
diff --git a/modules/ims_charging/ims_ro.c b/modules/ims_charging/ims_ro.c
index ae13389..f71dc98 100644
--- a/modules/ims_charging/ims_ro.c
+++ b/modules/ims_charging/ims_ro.c
@@ -954,7 +954,7 @@ 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) {
+    if ((called_asserted_identity = cscf_get_public_identity_from_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 = cscf_get_public_identity_from_requri(msg);
 	    free_called_asserted_identity = 1;
diff --git a/modules/ims_charging/mod.c b/modules/ims_charging/mod.c
index 4fb423f..bbc2708 100644
--- a/modules/ims_charging/mod.c
+++ b/modules/ims_charging/mod.c
@@ -362,7 +362,7 @@ static int w_ro_ccr(struct sip_msg *msg, str* route_name, str* direction, str* c
 		
 	} else if (dir == RO_TERM_DIRECTION){
 		//get callee IMPU from called part id - if not present then skip this
-		if ((identity = cscf_get_called_party_id(msg, &h)).len == 0) {
+		if ((identity = cscf_get_public_identity_from_called_party_id(msg, &h)).len == 0) {
 			LM_WARN("No P-Called-Identity hdr found - will not get callbacks if this IMPU is removed to terminate call");
 			goto send_ccr;
 		}
diff --git a/modules/ims_registrar_pcscf/service_routes.c b/modules/ims_registrar_pcscf/service_routes.c
index 6360aab..cafed54 100644
--- a/modules/ims_registrar_pcscf/service_routes.c
+++ b/modules/ims_registrar_pcscf/service_routes.c
@@ -481,7 +481,7 @@ int assert_called_identity(struct sip_msg* _m, udomain_t* _d) {
 		goto error;
 	}
 	
-	called_party_id = cscf_get_called_party_id(req, &h);
+	called_party_id = cscf_get_public_identity_from_called_party_id(req, &h);
 	
 		
 	if (!called_party_id.len){




More information about the sr-dev mailing list