[Asterisk-code-review] res_pjsip: Add support for partial transport reload. (asterisk[master])

Joshua Colp asteriskteam at digium.com
Thu Mar 18 09:07:07 CDT 2021


Joshua Colp has uploaded this change for review. ( https://gerrit.asterisk.org/c/asterisk/+/15633 )


Change subject: res_pjsip: Add support for partial transport reload.
......................................................................

res_pjsip: Add support for partial transport reload.

Some configuration items for a transport do not result in
the underlying transport changing, but instead are just
state we keep ourselves and use. It is perfectly reasonable
to change these items.

These include local_net and external_* information.

ASTERISK-29354

Change-Id: I027857ccfe4419f460243e562b5f098434b3d43a
---
A doc/CHANGES-staging/pjsip_transport_partial_reload.txt
M res/res_pjsip/config_transport.c
2 files changed, 16 insertions(+), 11 deletions(-)



  git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/33/15633/1

diff --git a/doc/CHANGES-staging/pjsip_transport_partial_reload.txt b/doc/CHANGES-staging/pjsip_transport_partial_reload.txt
new file mode 100644
index 0000000..1d1b0b6
--- /dev/null
+++ b/doc/CHANGES-staging/pjsip_transport_partial_reload.txt
@@ -0,0 +1,4 @@
+Subject: res_pjsip
+
+PJSIP transports can now be partially reloaded safely. This allows the
+local_net and external_* options to be updated without restarting Asterisk.
diff --git a/res/res_pjsip/config_transport.c b/res/res_pjsip/config_transport.c
index 0cf118e..6e449c3 100644
--- a/res/res_pjsip/config_transport.c
+++ b/res/res_pjsip/config_transport.c
@@ -670,20 +670,15 @@
 			return 0;
 		}
 
-		if (!transport->allow_reload && !transport->flow) {
-			if (!perm_state->change_detected) {
-				perm_state->change_detected = 1;
-				ast_log(LOG_WARNING, "Transport '%s' is not reloadable, maintaining previous values\n", transport_id);
-			}
-			/* In case someone is using the deprecated fields, reset them */
-			transport->state = perm_state->state;
-			copy_state_to_transport(transport);
-			ao2_replace(perm_state->transport, transport);
-			return 0;
+		/* If we aren't allowed to reload then we copy values that can't be changed from perm_state */
+		if (!transport->allow_reload) {
+			memcpy(&temp_state->state->host, &perm_state->state->host, sizeof(temp_state->state->host));
+			memcpy(&temp_state->state->tls, &perm_state->state->tls, sizeof(temp_state->state->tls));
+			memcpy(&temp_state->state->ciphers, &perm_state->state->ciphers, sizeof(temp_state->state->ciphers));
 		}
 	}
 
-	if (!transport->flow) {
+	if (!transport->flow && (!perm_state || transport->allow_reload)) {
 		if (temp_state->state->host.addr.sa_family != PJ_AF_INET && temp_state->state->host.addr.sa_family != PJ_AF_INET6) {
 			ast_log(LOG_ERROR, "Transport '%s' could not be started as binding not specified\n", transport_id);
 			return -1;
@@ -739,6 +734,12 @@
 
 		temp_state->state->flow = 1;
 		res = PJ_SUCCESS;
+	} else if (!transport->allow_reload && perm_state) {
+		/* We inherit the transport from perm state, untouched */
+		ast_log(LOG_WARNING, "Transport '%s' is not fully reloadable, not reloading: protocol, bind, TLS, TCP, ToS, or CoS options.\n", transport_id);
+		temp_state->state->transport = perm_state->state->transport;
+		perm_state->state->transport = NULL;
+		res = PJ_SUCCESS;
 	} else if (transport->type == AST_TRANSPORT_UDP) {
 
 		for (i = 0; i < BIND_TRIES && res != PJ_SUCCESS; i++) {

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

Gerrit-Project: asterisk
Gerrit-Branch: master
Gerrit-Change-Id: I027857ccfe4419f460243e562b5f098434b3d43a
Gerrit-Change-Number: 15633
Gerrit-PatchSet: 1
Gerrit-Owner: Joshua Colp <jcolp at sangoma.com>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-code-review/attachments/20210318/dfa0b7c5/attachment-0001.html>


More information about the asterisk-code-review mailing list