[Asterisk-code-review] res_pjsip_t38: bind UDPTL sessions like RTP (asterisk[18])

Matthew Kern asteriskteam at digium.com
Mon Jul 19 11:35:02 CDT 2021


Matthew Kern has uploaded this change for review. ( https://gerrit.asterisk.org/c/asterisk/+/16156 )


Change subject: res_pjsip_t38: bind UDPTL sessions like RTP
......................................................................

res_pjsip_t38: bind UDPTL sessions like RTP

In res_pjsip_sdp_rtp, the bind_rtp_to_media_address option and the
fallback use of the transport's bind address solve problems sending
media on systems that cannot send ipv4 packets on ipv6 sockets, and
certain other situations. This change extends both of these behaviors
to UDPTL sessions as well in res_pjsip_t38, to fix fax-specific
problems on these systems, introducing a new option
endpoint/t38_bind_udptl_to_media_address.

ASTERISK-29402

Change-Id: I87220c0e9cdd2fe9d156846cb906debe08c63557
---
A doc/CHANGES-staging/res_pjsip_t38_bind_fixes.txt
M include/asterisk/res_pjsip.h
M res/res_pjsip/pjsip_configuration.c
M res/res_pjsip_t38.c
4 files changed, 54 insertions(+), 1 deletion(-)



  git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/56/16156/1

diff --git a/doc/CHANGES-staging/res_pjsip_t38_bind_fixes.txt b/doc/CHANGES-staging/res_pjsip_t38_bind_fixes.txt
new file mode 100644
index 0000000..10da941
--- /dev/null
+++ b/doc/CHANGES-staging/res_pjsip_t38_bind_fixes.txt
@@ -0,0 +1,9 @@
+Subject: Use same bind logic from RTP sessions for UDPTL init
+
+In res_pjsip_sdp_rtp, the bind_rtp_to_media_address option and the 
+fallback use of the transport's bind address solve problems sending 
+media on systems that cannot send ipv4 packets on ipv6 sockets, and 
+certain other situations. This change extends both of these behaviors 
+to UDPTL sessions as well in res_pjsip_t38, to fix fax-specific 
+problems on these systems, introducing a new option 
+endpoint/t38_bind_udptl_to_media_address.
diff --git a/include/asterisk/res_pjsip.h b/include/asterisk/res_pjsip.h
index 351ce09..d081c29 100644
--- a/include/asterisk/res_pjsip.h
+++ b/include/asterisk/res_pjsip.h
@@ -758,6 +758,8 @@
 	unsigned int nat;
 	/*! Whether to use IPv6 for UDPTL or not */
 	unsigned int ipv6;
+	/*! Bind the UDPTL instance to the media_address */
+	unsigned int bind_udptl_to_media_address;
 };
 
 /*!
diff --git a/res/res_pjsip/pjsip_configuration.c b/res/res_pjsip/pjsip_configuration.c
index 6defa7c..c27b587 100644
--- a/res/res_pjsip/pjsip_configuration.c
+++ b/res/res_pjsip/pjsip_configuration.c
@@ -2077,6 +2077,7 @@
 	ast_sorcery_object_field_register(sip_sorcery, "endpoint", "fax_detect_timeout", "0", OPT_UINT_T, 0, FLDSET(struct ast_sip_endpoint, faxdetect_timeout));
 	ast_sorcery_object_field_register(sip_sorcery, "endpoint", "t38_udptl_nat", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.t38.nat));
 	ast_sorcery_object_field_register(sip_sorcery, "endpoint", "t38_udptl_ipv6", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.t38.ipv6));
+	ast_sorcery_object_field_register(sip_sorcery, "endpoint", "t38_bind_udptl_to_media_address", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.t38.bind_udptl_to_media_address));
 	ast_sorcery_object_field_register(sip_sorcery, "endpoint", "tone_zone", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, zone));
 	ast_sorcery_object_field_register(sip_sorcery, "endpoint", "language", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, language));
 	ast_sorcery_object_field_register(sip_sorcery, "endpoint", "record_on_feature", "automixmon", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, info.recording.onfeature));
diff --git a/res/res_pjsip_t38.c b/res/res_pjsip_t38.c
index 5d7f68d..7df35d9 100644
--- a/res/res_pjsip_t38.c
+++ b/res/res_pjsip_t38.c
@@ -255,11 +255,52 @@
 /*! \brief Initializes UDPTL support on a session, only done when actually needed */
 static int t38_initialize_session(struct ast_sip_session *session, struct ast_sip_session_media *session_media)
 {
+	struct ast_sockaddr temp_media_address;
+	struct ast_sockaddr *media_address = &address;
+
 	if (session_media->udptl) {
 		return 0;
 	}
 
-	if (!(session_media->udptl = ast_udptl_new_with_bindaddr(NULL, NULL, 0, &address))) {
+	if (session->endpoint->media.t38.bind_udptl_to_media_address && !ast_strlen_zero(session->endpoint->media.address)) {
+		if (ast_sockaddr_parse(&temp_media_address, session->endpoint->media.address, 0)) {
+			ast_debug(5, "Endpoint %s: Binding UDPTL media to %s\n",
+				ast_sorcery_object_get_id(session->endpoint),
+				session->endpoint->media.address);
+			media_address = &temp_media_address;
+		} else {
+			ast_debug(5, "Endpoint %s: UDPTL media address invalid: %s\n",
+				ast_sorcery_object_get_id(session->endpoint),
+				session->endpoint->media.address);
+		}
+	} else {
+		struct ast_sip_transport *transport;
+
+		transport = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "transport",
+				session->endpoint->transport);
+		if (transport) {
+			struct ast_sip_transport_state *trans_state;
+
+			trans_state = ast_sip_get_transport_state(ast_sorcery_object_get_id(transport));
+			if (trans_state) {
+				char hoststr[PJ_INET6_ADDRSTRLEN];
+
+				pj_sockaddr_print(&trans_state->host, hoststr, sizeof(hoststr), 0);
+				if (ast_sockaddr_parse(&temp_media_address, hoststr, 0)) {
+					ast_debug(5, "Transport %s bound to %s: Using it for UDPTL media.\n",
+						session->endpoint->transport, hoststr);
+					media_address = &temp_media_address;
+				} else {
+					ast_debug(5, "Transport %s bound to %s: Invalid for UDPTL media.\n",
+						session->endpoint->transport, hoststr);
+				}
+				ao2_ref(trans_state, -1);
+			}
+			ao2_ref(transport, -1);
+		}
+	}
+
+	if (!(session_media->udptl = ast_udptl_new_with_bindaddr(NULL, NULL, 0, media_address))) {
 		return -1;
 	}
 

-- 
To view, visit https://gerrit.asterisk.org/c/asterisk/+/16156
To unsubscribe, or for help writing mail filters, visit https://gerrit.asterisk.org/settings

Gerrit-Project: asterisk
Gerrit-Branch: 18
Gerrit-Change-Id: I87220c0e9cdd2fe9d156846cb906debe08c63557
Gerrit-Change-Number: 16156
Gerrit-PatchSet: 1
Gerrit-Owner: Matthew Kern <mkern at alconconstruction.com>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-code-review/attachments/20210719/9d88078b/attachment.html>


More information about the asterisk-code-review mailing list