[asterisk-commits] mmichelson: branch 1.8 r370769 - in /branches/1.8/channels: ./ sip/ sip/include/
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Fri Aug 3 16:35:10 CDT 2012
Author: mmichelson
Date: Fri Aug 3 16:35:00 2012
New Revision: 370769
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=370769
Log:
Fix error in the "IPorHost" section of a SIP dialstring.
This is based on the review request posted by Walter Doekes
(referenced lower in the commit message)
The main fix here is to treat the IPorHost portion of the dial
string as a temporary outbound proxy. This ensures requests
get sent to the proper location.
Due to the age of the request, some parts were no longer relevant.
For instance, the request moved outbound proxy parsing code into
a single method. This is done in a previous commit, so it was not
necessary to do again.
Also, the review request fixed some errors with regards to request
routing for CANCEL and ACK requests. This has also been fixed in
more recent commits.
(closes issue ASTERISK-19677)
reported by Walter Doekes
Review https://reviewboard.asterisk.org/r/1859
Modified:
branches/1.8/channels/chan_sip.c
branches/1.8/channels/sip/config_parser.c
branches/1.8/channels/sip/include/sip.h
Modified: branches/1.8/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/chan_sip.c?view=diff&rev=370769&r1=370768&r2=370769
==============================================================================
--- branches/1.8/channels/chan_sip.c (original)
+++ branches/1.8/channels/chan_sip.c Fri Aug 3 16:35:00 2012
@@ -1513,7 +1513,7 @@
static const struct ast_sockaddr *sip_real_dst(const struct sip_pvt *p);
static void build_via(struct sip_pvt *p);
static int create_addr_from_peer(struct sip_pvt *r, struct sip_peer *peer);
-static int create_addr(struct sip_pvt *dialog, const char *opeer, struct ast_sockaddr *addr, int newdialog, struct ast_sockaddr *remote_address);
+static int create_addr(struct sip_pvt *dialog, const char *opeer, struct ast_sockaddr *addr, int newdialog);
static char *generate_random_string(char *buf, size_t size);
static void build_callid_pvt(struct sip_pvt *pvt);
static void change_callid_pvt(struct sip_pvt *pvt, const char *callid);
@@ -1936,7 +1936,7 @@
sip_pvt_lock(monitor_instance->subscription_pvt);
ast_set_flag(&monitor_instance->subscription_pvt->flags[0], SIP_OUTGOING);
- create_addr(monitor_instance->subscription_pvt, monitor_instance->peername, 0, 1, NULL);
+ create_addr(monitor_instance->subscription_pvt, monitor_instance->peername, 0, 1);
ast_sip_ouraddrfor(&monitor_instance->subscription_pvt->sa, &monitor_instance->subscription_pvt->ourip, monitor_instance->subscription_pvt);
monitor_instance->subscription_pvt->subscribed = CALL_COMPLETION;
monitor_instance->subscription_pvt->expiry = when;
@@ -3174,6 +3174,12 @@
/*! \brief Get default outbound proxy or global proxy */
static struct sip_proxy *obproxy_get(struct sip_pvt *dialog, struct sip_peer *peer)
{
+ if (dialog && dialog->options && dialog->options->outboundproxy) {
+ if (sipdebug) {
+ ast_debug(1, "BLAH\n");
+ }
+ return dialog->options->outboundproxy;
+ }
if (peer && peer->outboundproxy) {
if (sipdebug) {
ast_debug(1, "OBPROXY: Applying peer OBproxy to this call\n");
@@ -5444,7 +5450,7 @@
/*! \brief create address structure from device name
* Or, if peer not found, find it in the global DNS
* returns TRUE (-1) on failure, FALSE on success */
-static int create_addr(struct sip_pvt *dialog, const char *opeer, struct ast_sockaddr *addr, int newdialog, struct ast_sockaddr *remote_address)
+static int create_addr(struct sip_pvt *dialog, const char *opeer, struct ast_sockaddr *addr, int newdialog)
{
struct sip_peer *peer;
char *peername, *peername2, *hostn;
@@ -5475,9 +5481,6 @@
set_socket_transport(&dialog->socket, 0);
}
res = create_addr_from_peer(dialog, peer);
- if (!ast_sockaddr_isnull(remote_address)) {
- ast_sockaddr_copy(&dialog->sa, remote_address);
- }
dialog->relatedpeer = ref_peer(peer, "create_addr: setting dialog's relatedpeer pointer");
unref_peer(peer, "create_addr: unref peer from find_peer hashtab lookup");
return res;
@@ -5836,8 +5839,12 @@
if (dumphistory)
sip_dump_history(p);
- if (p->options)
+ if (p->options) {
+ if (p->options->outboundproxy) {
+ ao2_ref(p->options->outboundproxy, -1);
+ }
ast_free(p->options);
+ }
if (p->notify) {
ast_variables_destroy(p->notify->headers);
@@ -12238,7 +12245,7 @@
sip_pvt_lock(pvt);
- if (create_addr(pvt, epa_entry->destination, NULL, TRUE, NULL)) {
+ if (create_addr(pvt, epa_entry->destination, NULL, TRUE)) {
sip_pvt_unlock(pvt);
dialog_unlink_all(pvt);
dialog_unref(pvt, "create_addr failed in transmit_publish. Unref dialog");
@@ -12552,7 +12559,7 @@
}
/* Setup the destination of our subscription */
- if (create_addr(mwi->call, mwi->hostname, &mwi->us, 0, NULL)) {
+ if (create_addr(mwi->call, mwi->hostname, &mwi->us, 0)) {
dialog_unlink_all(mwi->call);
mwi->call = dialog_unref(mwi->call, "unref dialog after unlink_all");
return 0;
@@ -13036,7 +13043,7 @@
return 0;
}
- if (create_addr(p, channame, NULL, 0, NULL)) {
+ if (create_addr(p, channame, NULL, 0)) {
/* Maybe they're not registered, etc. */
dialog_unlink_all(p);
dialog_unref(p, "unref dialog inside for loop" );
@@ -13380,7 +13387,7 @@
}
/* Find address to hostname */
- if (create_addr(p, S_OR(r->peername, r->hostname), &r->us, 0, NULL)) {
+ if (create_addr(p, S_OR(r->peername, r->hostname), &r->us, 0)) {
/* we have what we hope is a temporary network error,
* probably DNS. We need to reschedule a registration try */
dialog_unlink_all(p);
@@ -19177,7 +19184,7 @@
return CLI_FAILURE;
}
- if (create_addr(p, a->argv[i], NULL, 1, NULL)) {
+ if (create_addr(p, a->argv[i], NULL, 1)) {
/* Maybe they're not registered, etc. */
dialog_unlink_all(p);
dialog_unref(p, "unref dialog inside for loop" );
@@ -20667,6 +20674,9 @@
ast_debug(3, "Got 200 OK on subscription for MWI\n");
set_pvt_allowed_methods(p, req);
if (p->options) {
+ if (p->options->outboundproxy) {
+ ao2_ref(p->options->outboundproxy, -1);
+ }
ast_free(p->options);
p->options = NULL;
}
@@ -26790,15 +26800,9 @@
}
if (!ast_strlen_zero(remote_address)) {
- if (ast_sockaddr_resolve_first_transport(&remote_address_sa, remote_address, 0, transport)) {
- ast_log(LOG_WARNING, "Unable to find IP address for host %s. We will not use this remote IP address\n", remote_address);
- } else {
- if (!ast_sockaddr_port(&remote_address_sa)) {
- ast_sockaddr_set_port(&remote_address_sa,
- transport & SIP_TRANSPORT_TLS ?
- STANDARD_TLS_PORT :
- STANDARD_SIP_PORT);
- }
+ p->options->outboundproxy = proxy_from_config(remote_address, 0, NULL);
+ if (!p->options->outboundproxy) {
+ ast_log(LOG_WARNING, "Unable to parse outboundproxy %s. We will not use this remote IP address\n", remote_address);
}
}
@@ -26809,7 +26813,7 @@
ext = extension (user part of URI)
dnid = destination of the call (applies to the To: header)
*/
- if (create_addr(p, host, NULL, 1, &remote_address_sa)) {
+ if (create_addr(p, host, NULL, 1)) {
*cause = AST_CAUSE_UNREGISTERED;
ast_debug(3, "Cant create SIP call - target device not registered\n");
dialog_unlink_all(p);
Modified: branches/1.8/channels/sip/config_parser.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/sip/config_parser.c?view=diff&rev=370769&r1=370768&r2=370769
==============================================================================
--- branches/1.8/channels/sip/config_parser.c (original)
+++ branches/1.8/channels/sip/config_parser.c Fri Aug 3 16:35:00 2012
@@ -652,14 +652,17 @@
if ((*hostname = strstr(line, "://"))) {
*hostname += 3;
- if (!strncasecmp(line, "tcp", 3))
+ if (!strncasecmp(line, "tcp", 3)) {
*transport = SIP_TRANSPORT_TCP;
- else if (!strncasecmp(line, "tls", 3))
+ } else if (!strncasecmp(line, "tls", 3)) {
*transport = SIP_TRANSPORT_TLS;
- else if (!strncasecmp(line, "udp", 3))
+ } else if (!strncasecmp(line, "udp", 3)) {
*transport = SIP_TRANSPORT_UDP;
- else
+ } else if (lineno) {
ast_log(LOG_NOTICE, "'%.3s' is not a valid transport type on line %d of sip.conf. defaulting to udp.\n", line, lineno);
+ } else {
+ ast_log(LOG_NOTICE, "'%.3s' is not a valid transport type in sip config. defaulting to udp.\n", line, lineno);
+ }
} else {
*hostname = line;
*transport = SIP_TRANSPORT_UDP;
@@ -671,14 +674,22 @@
line = *hostname;
if (ast_sockaddr_split_hostport(line, hostname, &port, 0) == 0) {
- ast_log(LOG_WARNING, "Cannot parse host '%s' on line %d of sip.conf.\n",
- line, lineno);
+ if (lineno) {
+ ast_log(LOG_WARNING, "Cannot parse host '%s' on line %d of sip.conf.\n",
+ line, lineno);
+ } else {
+ ast_log(LOG_WARNING, "Cannot parse host '%s' in sip config.\n", line);
+ }
return -1;
}
if (port) {
if (!sscanf(port, "%5u", portnum)) {
- ast_log(LOG_NOTICE, "'%s' is not a valid port number on line %d of sip.conf. using default.\n", port, lineno);
+ if (lineno) {
+ ast_log(LOG_NOTICE, "'%s' is not a valid port number on line %d of sip.conf. using default.\n", port, lineno);
+ } else {
+ ast_log(LOG_NOTICE, "'%s' is not a valid port number in sip config. using default.\n", port);
+ }
port = NULL;
}
}
Modified: branches/1.8/channels/sip/include/sip.h
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/sip/include/sip.h?view=diff&rev=370769&r1=370768&r2=370769
==============================================================================
--- branches/1.8/channels/sip/include/sip.h (original)
+++ branches/1.8/channels/sip/include/sip.h Fri Aug 3 16:35:00 2012
@@ -794,6 +794,7 @@
enum sip_auth_type auth_type; /*!< Authentication type */
const char *replaces; /*!< Replaces header for call transfers */
int transfer; /*!< Flag - is this Invite part of a SIP transfer? (invite/replaces) */
+ struct sip_proxy *outboundproxy; /*!< Outbound proxy URI */
};
/*! \brief Structure to save routing information for a SIP session */
More information about the asterisk-commits
mailing list