aboutsummaryrefslogtreecommitdiffstats
path: root/channels
diff options
context:
space:
mode:
authordvossel <dvossel@f38db490-d61c-443f-a65b-d21fe96a405b>2009-07-10 22:50:51 +0000
committerdvossel <dvossel@f38db490-d61c-443f-a65b-d21fe96a405b>2009-07-10 22:50:51 +0000
commitd2d70af88ad8e11efbd971f224f4207349cbb86a (patch)
treef689edee0eb908722a6f29a21d3ef02975d42810 /channels
parent5b54a1ab1f6b1691e3fe5b6f62072c2667eeb5ba (diff)
Merged revisions 205985 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk ........ r205985 | dvossel | 2009-07-10 16:42:10 -0500 (Fri, 10 Jul 2009) | 16 lines SIP register not using peer's outbound proxy If callbackextension is defined for a peer it successfully causes a registration to occur, but the registration ignores the outboundproxy settings for the peer. This patch allows the peer to be passed to obproxy_get() in transmit_register(). (closes issue #14344) Reported by: Nick_Lewis Patches: callbackextension_peer_trunk.diff uploaded by dvossel (license 671) Tested by: dvossel Review: https://reviewboard.asterisk.org/r/294/ ........ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.0@206017 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_sip.c32
1 files changed, 27 insertions, 5 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 99fc524cf..dff62f633 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -1559,6 +1559,7 @@ struct sip_registry {
AST_STRING_FIELD(md5secret); /*!< Password in md5 */
AST_STRING_FIELD(callback); /*!< Contact extension */
AST_STRING_FIELD(random);
+ AST_STRING_FIELD(peername); /*!< Peer registering to */
);
enum sip_transport transport;
int portno; /*!< Optional port override */
@@ -6480,15 +6481,24 @@ static int sip_register(const char *value, int lineno)
char buf[256] = "";
char *username = NULL;
char *port = NULL;
- char *hostname=NULL, *secret=NULL, *authuser=NULL;
- char *callback=NULL;
+ char *hostname=NULL, *secret=NULL, *authuser=NULL, *tmp=NULL;
+ char *callback=NULL, *peername=NULL;
if (!value)
return -1;
ast_copy_string(buf, value, sizeof(buf));
- sip_parse_host(buf, lineno, &username, &portnum, &transport);
+ /* split [peername?][transport://] */
+ tmp = strchr(buf, '?');
+ if (tmp) {
+ *tmp++ = '\0';
+ peername = buf;
+ } else {
+ tmp = buf;
+ }
+ /* tmp is set at the beginning of [transport://] */
+ sip_parse_host(tmp, lineno, &username, &portnum, &transport);
/* First split around the last '@' then parse the two components. */
hostname = strrchr(username, '@'); /* allow @ in the first part */
@@ -6545,6 +6555,9 @@ static int sip_register(const char *value, int lineno)
ast_string_field_set(reg, authuser, authuser);
if (secret)
ast_string_field_set(reg, secret, secret);
+ if (peername) {
+ ast_string_field_set(reg, peername, peername);
+ }
reg->transport = transport;
reg->expire = -1;
reg->expiry = default_expiry;
@@ -9899,6 +9912,8 @@ static int transmit_register(struct sip_registry *r, int sipmethod, const char *
}
} else {
/* Build callid for registration if we haven't registered before */
+ struct sip_peer *peer = NULL;
+
if (!r->callid_valid) {
build_callid_registry(r, internip.sin_addr, default_fromdomain);
r->callid_valid = TRUE;
@@ -9908,10 +9923,17 @@ static int transmit_register(struct sip_registry *r, int sipmethod, const char *
ast_log(LOG_WARNING, "Unable to allocate registration transaction (memory or socket error)\n");
return 0;
}
-
+
if (p->do_history)
append_history(p, "RegistryInit", "Account: %s@%s", r->username, r->hostname);
+ if (!ast_strlen_zero(r->peername)) {
+ if (!(peer = find_peer(r->peername, NULL, 1, 0))) {
+ ast_log(LOG_WARNING, "Could not find peer %s in transmit_register\n", r->peername);
+ }
+ }
+ obproxy_get(p, peer); /* it is ok to pass a NULL peer into obproxy_get() */
+
p->outboundproxy = obproxy_get(p, NULL);
/* Find address to hostname */
@@ -21734,7 +21756,7 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, str
if (!ast_strlen_zero(callback)) { /* build string from peer info */
char *reg_string;
- if (asprintf(&reg_string, "%s:%s@%s/%s", peer->username, peer->secret, peer->tohost, callback) < 0) {
+ if (asprintf(&reg_string, "%s?%s:%s@%s/%s", peer->name, peer->username, peer->secret, peer->tohost, callback) < 0) {
ast_log(LOG_WARNING, "asprintf() failed: %s\n", strerror(errno));
} else if (reg_string) {
sip_register(reg_string, 0); /* XXX TODO: count in registry_count */