]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
pjsip_transport_events: handle multiple addresses for a domain
authorThomas Guebels <thomas.guebels@dstny.com>
Tue, 29 Oct 2024 14:32:33 +0000 (15:32 +0100)
committerThomas Guebels <thomas.guebels@dstny.com>
Tue, 12 Nov 2024 20:14:28 +0000 (20:14 +0000)
The key used for transport monitors was the remote host name for the
transport and not the remote address resolved for this domain.

This was problematic for domains returning multiple addresses as several
transport monitors were created with the same key.

Whenever a subsystem wanted to register a callback it would always end
up attached to the first transport monitor with a matching key.

The key used for transport monitors is now the remote address and port
the transport actually connected to.

Fixes: #932
include/asterisk/res_pjsip.h
res/res_pjsip/pjsip_transport_events.c

index dc66a40184f408b80d672a115ecf044bef3403c5..421acf4ee3857320b8387e234f94f17b55c1f692 100644 (file)
  * \param _dest The destination buffer of at least IP6ADDR_COLON_PORT_BUFLEN bytes
  */
 #define AST_SIP_MAKE_REMOTE_IPADDR_PORT_STR(_transport, _dest) \
-       snprintf(_dest, IP6ADDR_COLON_PORT_BUFLEN, \
-               PJSTR_PRINTF_SPEC ":%d", \
-               PJSTR_PRINTF_VAR(_transport->remote_name.host), \
-               _transport->remote_name.port);
+       pj_sockaddr_print(&_transport->key.rem_addr, _dest, sizeof(_dest), 1);
 
 /* Forward declarations of PJSIP stuff */
 struct pjsip_rx_data;
index aa575b7d584040bedfc588f4cfb8af28c87770b7..65a740cb2c98d06f11c1feb7c548ebdc68a64f7d 100644 (file)
@@ -173,6 +173,7 @@ static void transport_state_do_reg_callbacks(struct ao2_container *transports, p
 static void verify_log_result(int log_level, const pjsip_transport *transport,
        pj_uint32_t verify_status)
 {
+       char transport_remote_ipaddr_port[IP6ADDR_COLON_PORT_BUFLEN];
        const char *status[32];
        unsigned int count;
        unsigned int i;
@@ -184,9 +185,11 @@ static void verify_log_result(int log_level, const pjsip_transport *transport,
                return;
        }
 
+       AST_SIP_MAKE_REMOTE_IPADDR_PORT_STR(transport, transport_remote_ipaddr_port);
        for (i = 0; i < count; ++i) {
-               ast_log(log_level, _A_, "Transport '%s' to remote '%.*s' - %s\n", transport->factory->info,
+               ast_log(log_level, _A_, "Transport '%s' to remote '%.*s' - %s - %s\n", transport->factory->info,
                        (int)pj_strlen(&transport->remote_name.host), pj_strbuf(&transport->remote_name.host),
+                       transport_remote_ipaddr_port,
                        status[i]);
        }
 }
@@ -291,16 +294,16 @@ static void transport_state_callback(pjsip_transport *transport,
        pjsip_transport_state state, const pjsip_transport_state_info *info)
 {
        struct ao2_container *transports;
+       char transport_remote_ipaddr_port[IP6ADDR_COLON_PORT_BUFLEN];
 
        /* We only care about monitoring reliable transports */
        if (PJSIP_TRANSPORT_IS_RELIABLE(transport)
                && (transports = ao2_global_obj_ref(active_transports))) {
                struct transport_monitor *monitored;
+               AST_SIP_MAKE_REMOTE_IPADDR_PORT_STR(transport, transport_remote_ipaddr_port);
 
-               ast_debug(3, "Transport " PJSTR_PRINTF_SPEC ":%d(%s,%s): RefCnt: %ld state:%s\n",
-                       PJSTR_PRINTF_VAR(transport->remote_name.host),
-                       transport->remote_name.port, transport->obj_name,
-                       transport->type_name,
+               ast_debug(3, "Transport %s(%s,%s): RefCnt: %ld state:%s\n",
+                       transport_remote_ipaddr_port, transport->obj_name, transport->type_name,
                        pj_atomic_get(transport->ref_cnt), transport_state2str(state));
                switch (state) {
                case PJSIP_TP_STATE_CONNECTED:
@@ -316,7 +319,7 @@ static void transport_state_callback(pjsip_transport *transport,
                                break;
                        }
                        monitored->transport = transport;
-                       AST_SIP_MAKE_REMOTE_IPADDR_PORT_STR(transport, monitored->key);
+                       ast_copy_string(monitored->key, transport_remote_ipaddr_port, sizeof(monitored->key));
                        monitored->transport_obj_name = ast_strdup(transport->obj_name);
 
                        if (AST_VECTOR_INIT(&monitored->monitors, 5)) {