Browse Source

topos: added rr_update modparam

- control if record-route should be updated for requests within dialog
balajee 4 năm trước cách đây
mục cha
commit
4f2a66282c

+ 2 - 0
src/modules/topos/topos_mod.c

@@ -78,6 +78,7 @@ sruid_t _tps_sruid;
 static str _tps_db_url = str_init(DEFAULT_DB_URL);
 int _tps_param_mask_callid = 0;
 int _tps_sanity_checks = 0;
+int _tps_rr_update = 0;
 str _tps_storage = str_init("db");
 
 extern int _tps_branch_expire;
@@ -141,6 +142,7 @@ static param_export_t params[]={
 	{"cparam_name",		PARAM_STR, &_tps_cparam_name},
 	{"a_contact_avp",	PARAM_STR, &_tps_acontact_avp},
 	{"b_contact_avp",	PARAM_STR, &_tps_bcontact_avp},
+	{"rr_update",       PARAM_INT, &_tps_rr_update},
 	{0,0,0}
 };
 

+ 33 - 3
src/modules/topos/tps_msg.c

@@ -49,6 +49,7 @@
 extern int _tps_param_mask_callid;
 extern int _tps_contact_mode;
 extern str _tps_cparam_name;
+extern int _tps_rr_update;
 
 str _sr_hname_xbranch = str_init("P-SR-XBranch");
 str _sr_hname_xuuid = str_init("P-SR-XUID");
@@ -368,11 +369,18 @@ int tps_pack_message(sip_msg_t *msg, tps_data_t *ptsd)
 	int vlen;
 	int r2;
 	int isreq;
+	int rr_update = _tps_rr_update;
 
 	if(ptsd->cp==NULL) {
 		ptsd->cp = ptsd->cbuf;
 	}
 
+	if(_tps_rr_update) {
+		if((msg->first_line.type==SIP_REQUEST) && !(get_to(msg)->tag_value.len>0)) {
+			rr_update = 0;
+		}
+	}
+
 	i = 0;
 	for(hdr=msg->h_via1; hdr; hdr=next_sibling_hdr(hdr)) {
 		for(via=(struct via_body*)hdr->parsed; via; via=via->next) {
@@ -429,7 +437,7 @@ int tps_pack_message(sip_msg_t *msg, tps_data_t *ptsd)
 				LM_ERR("no more space to pack rr headers\n");
 				return -1;
 			}
-			if(isreq==1) {
+			if(isreq==1 || rr_update) {
 				/* sip request - get a+s-side record route */
 				if(i>1) {
 					if(i==2 &&r2==0) {
@@ -441,6 +449,12 @@ int tps_pack_message(sip_msg_t *msg, tps_data_t *ptsd)
 					*ptsd->cp = ',';
 					ptsd->cp++;
 					ptsd->a_rr.len++;
+					if(rr_update) {
+						ptsd->b_rr.len++;
+					}
+				}
+				if(i==1 && rr_update) {
+					ptsd->b_rr.s = ptsd->cp;
 				}
 				*ptsd->cp = '<';
 				if(i==1) {
@@ -458,6 +472,9 @@ int tps_pack_message(sip_msg_t *msg, tps_data_t *ptsd)
 
 				ptsd->cp++;
 				ptsd->a_rr.len++;
+				if(rr_update) {
+					ptsd->b_rr.len++;
+				}
 
 				memcpy(ptsd->cp, rr->nameaddr.uri.s, rr->nameaddr.uri.len);
 				if(i==1) {
@@ -483,6 +500,10 @@ int tps_pack_message(sip_msg_t *msg, tps_data_t *ptsd)
 				*ptsd->cp = '>';
 				ptsd->cp++;
 				ptsd->a_rr.len++;
+				if(rr_update) {
+					ptsd->b_rr.len += rr->nameaddr.uri.len;
+					ptsd->b_rr.len++;
+				}
 			} else {
 				/* sip response - get b-side record route */
 				if(i==1) {
@@ -879,6 +900,11 @@ int tps_request_received(sip_msg_t *msg, int dialog)
 	}
 	if(dialog!=0) {
 		tps_append_xuuid(msg, &stsd.a_uuid);
+		if(_tps_rr_update) {
+			if(tps_storage_update_dialog(msg, &mtsd, &stsd, TPS_DBU_RPLATTRS|TPS_DBU_BRR)<0) {
+				goto error;
+			}
+		}
 	}
 	return 0;
 
@@ -934,7 +960,9 @@ int tps_response_received(sip_msg_t *msg)
 				TPS_DBU_CONTACT|TPS_DBU_RPLATTRS)<0) {
 		goto error;
 	}
-	if(tps_storage_update_dialog(msg, &mtsd, &stsd, TPS_DBU_RPLATTRS)<0) {
+	if(tps_storage_update_dialog(msg, &mtsd, &stsd,
+			(_tps_rr_update)?(TPS_DBU_RPLATTRS|TPS_DBU_BRR|TPS_DBU_ARR)
+					:TPS_DBU_RPLATTRS)<0) {
 		goto error;
 	}
 	tps_storage_lock_release(&lkey);
@@ -1037,7 +1065,9 @@ int tps_request_sent(sip_msg_t *msg, int dialog, int local)
 
 	if(dialog!=0) {
 		tps_storage_end_dialog(msg, &mtsd, ptsd);
-		if(tps_storage_update_dialog(msg, &mtsd, &stsd, TPS_DBU_CONTACT)<0) {
+		if(tps_storage_update_dialog(msg, &mtsd, &stsd,
+					(_tps_rr_update)?(TPS_DBU_CONTACT|TPS_DBU_ARR)
+						:TPS_DBU_CONTACT)<0) {
 			goto error;
 		}
 	}

+ 3 - 1
src/modules/topos/tps_storage.h

@@ -39,7 +39,9 @@
 
 #define TPS_DBU_CONTACT		(1<<0)
 #define TPS_DBU_RPLATTRS	(1<<1)
-#define TPS_DBU_ALL			(0xffffffff)
+#define TPS_DBU_ARR		(1<<2)
+#define TPS_DBU_BRR		(1<<3)
+#define TPS_DBU_ALL		(0xffffffff)
 
 #define TPS_DATA_SIZE	8192
 typedef struct tps_data {