[Freeswitch-branches] [commit] r6688 - freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia

Freeswitch SVN stkn at freeswitch.org
Tue Dec 11 19:47:25 EST 2007


Author: stkn
Date: Tue Dec 11 19:47:25 2007
New Revision: 6688

Modified:
   freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c
   freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia/mod_sofia.h
   freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia/sofia.c
   freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c

Log:
Still not working...

Modified: freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c
==============================================================================
--- freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c	(original)
+++ freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c	Tue Dec 11 19:47:25 2007
@@ -328,6 +328,8 @@
 		}
 	}
 
+	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Answering channel with reply_contact: %s\n", tech_pvt->reply_contact);
+
 	nua_respond(tech_pvt->nh, SIP_200_OK,
 				NUTAG_SESSION_TIMER(session_timeout),
 				SIPTAG_CONTACT_STR(tech_pvt->reply_contact),

Modified: freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia/mod_sofia.h
==============================================================================
--- freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia/mod_sofia.h	(original)
+++ freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia/mod_sofia.h	Tue Dec 11 19:47:25 2007
@@ -220,6 +220,7 @@
 	char *username;
 	char *url;
 	char *bindurl;
+	char *tls_url;
 	char *tls_bindurl;
 	char *sipdomain;
 	char *timer_name;
@@ -533,4 +534,13 @@
 																		\
 		if(_session) break;												\
 	} while(!_session)
-	   
+
+
+/*
+ * Transport handling helper functions
+ */
+sofia_transport_t sofia_glue_via2transport(const sip_via_t *via);
+sofia_transport_t sofia_glue_url2transport(const url_t *url);
+
+const char *sofia_glue_transport2str(const sofia_transport_t tp);
+const char *sofia_glue_transport2scheme(const sofia_transport_t tp);

Modified: freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia/sofia.c
==============================================================================
--- freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia/sofia.c	(original)
+++ freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia/sofia.c	Tue Dec 11 19:47:25 2007
@@ -1062,8 +1062,10 @@
 					}
 
 					if (profile->extsipip) {
+						profile->tls_url = switch_core_sprintf(profile->pool, "sips:mod_sofia@%s:%d", profile->extsipip, profile->tls_sip_port);
 						profile->tls_bindurl = switch_core_sprintf(profile->pool, "sips:mod_sofia@%s:%d;maddr=%s", profile->extsipip, profile->tls_sip_port, profile->sipip);
 					} else {
+						profile->tls_url = switch_core_sprintf(profile->pool, "sips:mod_sofia@%s:%d", profile->extsipip, profile->tls_sip_port);
 						profile->tls_bindurl = switch_core_sprintf(profile->pool, "sips:mod_sofia@%s:%d", profile->sipip, profile->tls_sip_port);
 					}
 
@@ -2009,11 +2011,12 @@
 
 	if (sip->sip_to && sip->sip_to->a_url) {
 		const char *val;
-		char *transport = (my_addrinfo->ai_socktype == SOCK_STREAM) ? "tcp" : "udp";
-		
+		sofia_transport_t transport = sofia_glue_url2transport(sip->sip_contact->m_url);
+
 		url_set_chanvars(session, sip->sip_to->a_url, sip_to);
 		if ((val = switch_channel_get_variable(channel, "sip_to_uri"))) {
-			tech_pvt->to_uri = switch_core_session_sprintf(session, "sip:%s;transport=%s", val, transport);
+
+			tech_pvt->to_uri = switch_core_session_sprintf(session, "%s:%s;transport=%s", sofia_glue_transport2scheme(transport), val, sofia_glue_transport2str(transport));
 			if (profile->ndlb & PFLAG_NDLB_TO_IN_200_CONTACT) {
 				if (strchr(tech_pvt->to_uri, '>')) {
 					tech_pvt->reply_contact = tech_pvt->to_uri;
@@ -2022,18 +2025,20 @@
 				}
 			} else {
 				if (strchr(profile->url, '>')) {
-					tech_pvt->reply_contact = switch_core_session_sprintf(session, "%s;transport=%s", profile->url, transport);
+					tech_pvt->reply_contact = switch_core_session_sprintf(session, "%s;transport=%s", profile->url, sofia_glue_transport2str(transport));
 				} else {
-					tech_pvt->reply_contact = switch_core_session_sprintf(session, "<%s;transport=%s>", profile->url, transport);
+					tech_pvt->reply_contact = switch_core_session_sprintf(session, "<%s;transport=%s>", profile->url, sofia_glue_transport2str(transport));
 				}
 			}
 		} else {
 			if (strchr(profile->url, '>')) {
-				tech_pvt->reply_contact = switch_core_session_sprintf(session, "%s;transport=%s", profile->url, transport);
+				tech_pvt->reply_contact = switch_core_session_sprintf(session, "%s;transport=%s", profile->url, sofia_glue_transport2str(transport));
 			} else {
-				tech_pvt->reply_contact = switch_core_session_sprintf(session, "<%s;transport=%s>", profile->url, transport);
+				tech_pvt->reply_contact = switch_core_session_sprintf(session, "<%s;transport=%s>", profile->url, sofia_glue_transport2str(transport));
 			}
 		}
+
+		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Resulting Reply-Contact: %s\n", tech_pvt->reply_contact);
 	}
 
 	if (sip->sip_contact && sip->sip_contact->m_url) {

Modified: freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c
==============================================================================
--- freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c	(original)
+++ freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c	Tue Dec 11 19:47:25 2007
@@ -471,7 +471,121 @@
 	return SOFIA_TRANSPORT_UNKNOWN;
 }
 
-static const char *sofia_glue_transport2str(const sofia_transport_t tp)
+sofia_transport_t sofia_glue_url2transport(const url_t *url)
+{
+	char *ptr = NULL;
+	int tls = 0;
+
+	if(!url)
+		return SOFIA_TRANSPORT_UNKNOWN;
+
+	if (url->url_scheme && !strcasecmp(url->url_scheme, "sips")) {
+		tls++;
+	}
+
+	ptr = (char *)url->url_params;
+	while(ptr) {
+
+		if (!strncasecmp(ptr, "transport", 9)) {
+			ptr += 10;
+
+			if (!strncasecmp(ptr, "udp", 3)) {
+				return SOFIA_TRANSPORT_UDP;
+			}
+			else if (!strncasecmp(ptr, "tcp", 3)) {
+				return SOFIA_TRANSPORT_TCP;
+			}
+			else if (!strncasecmp(ptr, "tls", 3)) {
+				return SOFIA_TRANSPORT_TCP_TLS;
+			}
+			else if (!strncasecmp(ptr, "sctp", 4)) {
+				return SOFIA_TRANSPORT_SCTP;
+			}
+			break;
+		}
+
+		if ((ptr = strchr(ptr, ';')))
+			ptr++;
+	}
+
+	return (tls) ? SOFIA_TRANSPORT_TCP_TLS : SOFIA_TRANSPORT_UDP;
+}
+
+sofia_transport_t sofia_glue_via2transport(const sip_via_t *via)
+{
+	char *ptr = NULL;
+	int tls = 0;
+
+	if (!via || !via->v_protocol)
+		return SOFIA_TRANSPORT_UNKNOWN;
+
+	if (!strcasecmp(via->v_protocol, "sips")) {
+		tls++;
+	}
+
+	if ((ptr = strrchr(via->v_protocol, '/'))) {
+		ptr++;
+
+		if (!strcasecmp(ptr, "udp")) {
+			return SOFIA_TRANSPORT_UDP;
+		}
+		else if(!strcasecmp(ptr, "tcp")) {
+			return SOFIA_TRANSPORT_TCP;
+		}
+		else if(!strcasecmp(ptr, "tls")) {
+			return SOFIA_TRANSPORT_TCP_TLS;
+		}
+		else if(!strcasecmp(ptr, "sctp")) {
+			return SOFIA_TRANSPORT_SCTP;
+		}
+	}
+
+	return SOFIA_TRANSPORT_UNKNOWN;
+}
+
+#if 0
+sofia_transport_t sofia_glue_uri2transport(const char *uri)
+{
+	char *scheme = NULL, *transport = NULL;
+	int tls = 0;
+
+	if ((scheme = strchr(uri, '<'))) {
+		scheme++;
+	} else {
+		scheme = (char *)uri;
+	}
+
+	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "scheme: %s\n", scheme);
+
+	if (!strncasecmp(scheme, "sips", 4)) {
+		tls = 1;
+	}
+
+	if (!(transport = strchr(uri, ';'))) {
+		return (tls) ? SOFIA_TRANSPORT_TCP_TLS : SOFIA_TRANSPORT_UDP;
+	} else {
+		transport = strchr(transport, '=');
+		if (transport)
+			transport++;
+	}
+
+	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "transport: %s\n", transport);
+
+	if (!strncasecmp(transport, "tls", 3)) {
+		return SOFIA_TRANSPORT_TCP_TLS;
+	}
+	else if (!strncasecmp(transport, "tcp", 3)) {
+		return (tls) ? SOFIA_TRANSPORT_TCP_TLS : SOFIA_TRANSPORT_TCP;
+	}
+	else if (!strncasecmp(transport, "sctp", 4)) {
+		return SOFIA_TRANSPORT_SCTP;
+	}
+
+	return (tls) ? SOFIA_TRANSPORT_TCP_TLS : SOFIA_TRANSPORT_UDP;
+}
+#endif
+
+const char *sofia_glue_transport2str(const sofia_transport_t tp)
 {
 	switch(tp) {
 	case SOFIA_TRANSPORT_TCP:
@@ -488,7 +602,7 @@
 	}
 }
 
-static const char *sofia_glue_transport2scheme(const sofia_transport_t tp)
+const char *sofia_glue_transport2scheme(const sofia_transport_t tp)
 {
 	switch (tp) {
 	case SOFIA_TRANSPORT_TCP_TLS:
@@ -499,6 +613,17 @@
 	}
 }
 
+static int sofia_glue_transport_has_tls(const sofia_transport_t tp)
+{
+	switch(tp) {
+	case SOFIA_TRANSPORT_TCP_TLS:
+		return 1;
+
+	default:
+		return 0;
+	}
+}
+
 char *sofia_overcome_sip_uri_weakness(switch_core_session_t *session, const char *uri, const sofia_transport_t transport, switch_bool_t uri_only)
 {
 	char *stripped = switch_core_session_strdup(session, uri);
@@ -611,7 +736,7 @@
 			switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "URL Error! [%s]\n", tech_pvt->dest);
 			return SWITCH_STATUS_FALSE;
 		}
-		
+
 		if ((d_url = sofia_glue_get_url_from_contact(tech_pvt->dest, 1))) {
 			url = d_url;
 		} else {
@@ -620,16 +745,12 @@
 
 		url_str = url;
 
-		if (switch_strlen_zero(tech_pvt->invite_contact)) {
-			tech_pvt->invite_contact = tech_pvt->profile->url;
-		}
-		
 		if (!switch_strlen_zero(tech_pvt->gateway_from_str)) {
 			use_from_str = tech_pvt->gateway_from_str;
 		} else {
 			use_from_str = tech_pvt->from_str;
 		}
-		
+
 		rpid_domain = switch_core_session_strdup(session, use_from_str);
 		sofia_glue_get_url_from_contact(rpid_domain, 0);
 		if ((rpid_domain = strchr(rpid_domain, '@'))) {
@@ -655,12 +776,19 @@
 			}
 		}
 
+		if (switch_strlen_zero(tech_pvt->invite_contact)) {
+			if (sofia_glue_transport_has_tls(transport))
+				tech_pvt->invite_contact = tech_pvt->profile->tls_url;
+			else
+				tech_pvt->invite_contact = tech_pvt->profile->url;
+		}
+
 		url_str = sofia_overcome_sip_uri_weakness(session, url, transport, SWITCH_TRUE);
 		invite_contact = sofia_overcome_sip_uri_weakness(session, tech_pvt->invite_contact, transport, SWITCH_FALSE);
 		from_str = sofia_overcome_sip_uri_weakness(session, use_from_str, 0, SWITCH_FALSE);
 		to_str = sofia_overcome_sip_uri_weakness(session, tech_pvt->dest_to, 0, SWITCH_FALSE);
-		
-		/* 
+
+		/*
 		   Does the "genius" who wanted SIP to be "text-based" so it was "easier to read" even use it now,
 		   or did he just suggest it to make our lives miserable?
 		*/



More information about the Freeswitch-branches mailing list