[sr-dev] git:master: dialog: add contact header in REFER for dlg_bridge()

Daniel-Constantin Mierla miconda at gmail.com
Wed Jan 9 10:23:16 CET 2013


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

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date:   Tue Jan  8 22:34:00 2013 +0100

dialog: add contact header in REFER for dlg_bridge()

- some UAs reject the REFER if there is no contact header

---

 modules_k/dialog/dialog.c       |    7 ++++++
 modules_k/dialog/dlg_transfer.c |   46 ++++++++++++++++++++++++++++++++++----
 modules_k/dialog/dlg_transfer.h |    2 +
 3 files changed, 50 insertions(+), 5 deletions(-)

diff --git a/modules_k/dialog/dialog.c b/modules_k/dialog/dialog.c
index 13fa807..cd7dec6 100644
--- a/modules_k/dialog/dialog.c
+++ b/modules_k/dialog/dialog.c
@@ -112,6 +112,8 @@ int dlg_event_rt[DLG_EVENTRT_MAX];
 
 str dlg_bridge_controller = {"sip:controller at kamailio.org", 27};
 
+str dlg_bridge_contact = {"sip:controller at kamailio.org:5060", 32};
+
 str ruri_pvar_param = {"$ru", 3};
 pv_elem_t * ruri_param_model = NULL;
 
@@ -269,6 +271,7 @@ static param_export_t mod_params[]={
 	{ "profiles_with_value",   STR_PARAM, &profiles_wv_s            },
 	{ "profiles_no_value",     STR_PARAM, &profiles_nv_s            },
 	{ "bridge_controller",     STR_PARAM, &dlg_bridge_controller.s  },
+	{ "bridge_contact",        PARAM_STR, &dlg_bridge_contact       },
 	{ "ruri_pvar",             STR_PARAM, &ruri_pvar_param.s        },
 	{ "initial_cbs_inscript",  INT_PARAM, &initial_cbs_inscript     },
 	{ "send_bye",              INT_PARAM, &dlg_send_bye             },
@@ -469,6 +472,9 @@ static int mod_init(void)
 	if(faked_msg_init()<0)
 		return -1;
 
+	if(dlg_bridge_init_hdrs()<0)
+		return -1;
+
 	if (timeout_spec.s)
 		timeout_spec.len = strlen(timeout_spec.s);
 
@@ -744,6 +750,7 @@ static void mod_destroy(void)
 		dialog_update_db(0, 0);
 		destroy_dlg_db();
 	}
+	dlg_bridge_destroy_hdrs();
 	/* no DB interaction from now on */
 	dlg_db_mode = DB_MODE_NONE;
 	destroy_dlg_table();
diff --git a/modules_k/dialog/dlg_transfer.c b/modules_k/dialog/dlg_transfer.c
index a0c35cf..25d9e8d 100644
--- a/modules_k/dialog/dlg_transfer.c
+++ b/modules_k/dialog/dlg_transfer.c
@@ -40,10 +40,47 @@
 #define DLG_HOLD_SDP "v=0\r\no=kamailio-bridge 0 0 IN IP4 0.0.0.0\r\ns=kamailio\r\nc=IN IP4 0.0.0.0\r\nt=0 0\r\nm=audio 9 RTP/AVP 8 0\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:0 PCMU/8000\r\n"
 #define DLG_HOLD_SDP_LEN	(sizeof(DLG_HOLD_SDP)-1)
 
+/*
 #define DLG_HOLD_CT_HDR "Contact: <sip:kamailio.org:5060>\r\nContent-Type: application/sdp\r\n"
 #define DLG_HOLD_CT_HDR_LEN	(sizeof(DLG_HOLD_CT_HDR)-1)
+*/
 
 extern str dlg_bridge_controller;
+extern str dlg_bridge_contact;
+
+static char *dlg_bridge_hdrs_buf = NULL;
+static str dlg_bridge_inv_hdrs = {0};
+static str dlg_bridge_ref_hdrs = {0};
+
+int dlg_bridge_init_hdrs(void)
+{
+	if(dlg_bridge_hdrs_buf!=NULL)
+		return 0;
+	dlg_bridge_hdrs_buf = (char*)pkg_malloc((dlg_bridge_contact.len + 46)
+													* sizeof(char));
+	if(dlg_bridge_hdrs_buf==NULL) {
+		LM_ERR("no more pkg memory\n");
+		return -1;
+	}
+	strncpy(dlg_bridge_hdrs_buf,
+			"Contact: <", 10);
+	strncpy(dlg_bridge_hdrs_buf + 10,
+			dlg_bridge_contact.s, dlg_bridge_contact.len);
+	strncpy(dlg_bridge_hdrs_buf + 10 + dlg_bridge_contact.len,
+			">\r\nContent-Type: application/sdp\r\n", 34);
+	dlg_bridge_hdrs_buf[dlg_bridge_contact.len+44] = '\0';
+	dlg_bridge_inv_hdrs.s = dlg_bridge_hdrs_buf;
+	dlg_bridge_inv_hdrs.len = dlg_bridge_contact.len + 44;
+	dlg_bridge_ref_hdrs.s = dlg_bridge_hdrs_buf;
+	dlg_bridge_ref_hdrs.len = dlg_bridge_contact.len + 13;
+	return 0;
+}
+
+void dlg_bridge_destroy_hdrs(void)
+{
+	if(dlg_bridge_hdrs_buf!=NULL)
+		pkg_free(dlg_bridge_hdrs_buf);
+}
 
 void dlg_transfer_ctx_free(dlg_transfer_ctx_t *dtc)
 {
@@ -145,7 +182,7 @@ static int dlg_refer_callee(dlg_transfer_ctx_t *dtc)
 	}
 
 	hdrs.len = 23 + 2*CRLF_LEN + dlg_bridge_controller.len
-		+ dtc->to.len;
+		+ dtc->to.len + dlg_bridge_ref_hdrs.len;
 	LM_DBG("sending REFER [%d] <%.*s>\n", hdrs.len, dtc->to.len, dtc->to.s);
 	hdrs.s = (char*)pkg_malloc(hdrs.len*sizeof(char));
 	if(hdrs.s == NULL)
@@ -158,6 +195,8 @@ static int dlg_refer_callee(dlg_transfer_ctx_t *dtc)
 			dtc->to.len);
 	memcpy(hdrs.s+23+dlg_bridge_controller.len+CRLF_LEN+dtc->to.len,
 			CRLF, CRLF_LEN);
+	memcpy(hdrs.s+23+dlg_bridge_controller.len+CRLF_LEN+dtc->to.len+CRLF_LEN,
+			dlg_bridge_controller.s, dlg_bridge_controller.len);
 
 	memset(&uac_r, '\0', sizeof(uac_req_t));
 	set_uac_req(&uac_r, &met, &hdrs, NULL, dialog_info, TMCB_LOCAL_COMPLETED,
@@ -278,7 +317,6 @@ int dlg_bridge(str *from, str *to, str *op)
 	int ret;
 	str s_method = {"INVITE", 6};
 	str s_body;
-	str s_hdrs;
 	uac_req_t uac_r;
 
 	dtc = (dlg_transfer_ctx_t*)shm_malloc(sizeof(dlg_transfer_ctx_t));
@@ -314,12 +352,10 @@ int dlg_bridge(str *from, str *to, str *op)
 			dtc->to.len, dtc->to.s);
 	s_body.s   = DLG_HOLD_SDP;
 	s_body.len = DLG_HOLD_SDP_LEN;
-	s_hdrs.s   = DLG_HOLD_CT_HDR;
-	s_hdrs.len = DLG_HOLD_CT_HDR_LEN;
 
 	memset(&uac_r, '\0', sizeof(uac_req_t));
 	uac_r.method = &s_method;
-	uac_r.headers = &s_hdrs;
+	uac_r.headers = &dlg_bridge_inv_hdrs;
 	uac_r.body = &s_body;
 	uac_r.cb_flags = TMCB_LOCAL_COMPLETED;
 	uac_r.cb = dlg_bridge_tm_callback;
diff --git a/modules_k/dialog/dlg_transfer.h b/modules_k/dialog/dlg_transfer.h
index 3845e7c..ef05eeb 100644
--- a/modules_k/dialog/dlg_transfer.h
+++ b/modules_k/dialog/dlg_transfer.h
@@ -34,5 +34,7 @@ typedef struct _dlg_transfer_ctx {
 
 int dlg_bridge(str *from, str *to, str *op);
 int dlg_transfer(struct dlg_cell *dlg, str *to, int side);
+int dlg_bridge_init_hdrs(void);
+void dlg_bridge_destroy_hdrs(void);
 
 #endif




More information about the sr-dev mailing list