From c1c379238799e46f6e21fe166166f803da11d8e3 Mon Sep 17 00:00:00 2001 From: dvossel Date: Thu, 29 Jul 2010 20:42:29 +0000 Subject: fixes wrong SRV query for TLS connection (closes issue #17612) Reported by: marcelloceschia Patches: chan-sip_srvQuery.patch uploaded by marcelloceschia (license 1079) chan-sip_Trunk_srvQuery.patch uploaded by st (license 907) chan-sip_asterisk18b1_srvQuery.patch uploaded by marcelloceschia (license 1079) Tested by: marcelloceschia, st, pabelanger git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.2@280551 f38db490-d61c-443f-a65b-d21fe96a405b --- channels/chan_sip.c | 38 +++++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 14eb0e19b..78ce4d655 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -3527,6 +3527,33 @@ static inline const char *get_transport(enum sip_transport t) return "UNKNOWN"; } +/*! \brief Return protocol string for srv dns query */ +static inline const char *get_srv_protocol(enum sip_transport t) +{ + switch (t) { + case SIP_TRANSPORT_UDP: + return "udp"; + case SIP_TRANSPORT_TLS: + case SIP_TRANSPORT_TCP: + return "tcp"; + } + + return "udp"; +} + +/*! \brief Return service string for srv dns query */ +static inline const char *get_srv_service(enum sip_transport t) +{ + switch (t) { + case SIP_TRANSPORT_TCP: + case SIP_TRANSPORT_UDP: + return "sip"; + case SIP_TRANSPORT_TLS: + return "sips"; + } + return "sip"; +} + /*! \brief Return transport of dialog. \note this is based on a false assumption. We don't always use the outbound proxy for all requests in a dialog. It depends on the @@ -5316,8 +5343,9 @@ static int create_addr(struct sip_pvt *dialog, const char *opeer, struct sockadd if (!port && sip_cfg.srvlookup) { char service[MAXHOSTNAMELEN]; int tportno; - - snprintf(service, sizeof(service), "_sip._%s.%s", get_transport(dialog->socket.type), peername); + snprintf(service, sizeof(service), "_%s._%s.%s", + get_srv_service(dialog->socket.type), + get_srv_protocol(dialog->socket.type), peername); srv_ret = ast_get_srv(NULL, host, sizeof(host), &tportno, service); if (srv_ret > 0) { hostn = host; @@ -11041,7 +11069,7 @@ static int __sip_subscribe_mwi_do(struct sip_subscription_mwi *mwi) /* If we have no DNS manager let's do a lookup */ if (!mwi->dnsmgr) { char transport[MAXHOSTNAMELEN]; - snprintf(transport, sizeof(transport), "_sip._%s", get_transport(mwi->transport)); + snprintf(transport, sizeof(transport), "_%s._%s", get_srv_service(mwi->transport), get_srv_protocol(mwi->transport)); ast_dnsmgr_lookup(mwi->hostname, &mwi->us, &mwi->dnsmgr, sip_cfg.srvlookup ? transport : NULL); } @@ -11642,7 +11670,7 @@ static int transmit_register(struct sip_registry *r, int sipmethod, const char * if (r->dnsmgr == NULL) { char transport[MAXHOSTNAMELEN]; peer = find_peer(r->hostname, NULL, TRUE, FINDPEERS, FALSE, 0); - snprintf(transport, sizeof(transport), "_sip._%s", get_transport(r->transport)); /* have to use static get_transport function */ + snprintf(transport, sizeof(transport), "_%s._%s",get_srv_service(r->transport), get_srv_protocol(r->transport)); /* have to use static get_transport function */ ast_dnsmgr_lookup(peer ? peer->tohost : r->hostname, &r->us, &r->dnsmgr, sip_cfg.srvlookup ? transport : NULL); if (peer) { peer = unref_peer(peer, "removing peer ref for dnsmgr_lookup"); @@ -24300,7 +24328,7 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, str *params++ = '\0'; } - snprintf(transport, sizeof(transport), "_sip._%s", get_transport(peer->socket.type)); + snprintf(transport, sizeof(transport), "_%s._%s", get_srv_service(peer->socket.type), get_srv_protocol(peer->socket.type)); if (ast_dnsmgr_lookup(_srvlookup, &peer->addr, &peer->dnsmgr, sip_cfg.srvlookup && !peer->portinuri ? transport : NULL)) { ast_log(LOG_ERROR, "srvlookup failed for host: %s, on peer %s, removing peer\n", _srvlookup, peer->name); -- cgit v1.2.3