summaryrefslogtreecommitdiff
path: root/channels/chan_sip.c
diff options
context:
space:
mode:
authorScott Griepentrog <sgriepentrog@digium.com>2013-11-08 23:07:50 +0000
committerScott Griepentrog <sgriepentrog@digium.com>2013-11-08 23:07:50 +0000
commit094db82a734d9a7df6d13048d3d2dccea5cb9779 (patch)
treee7db33c632f2abc0c0235ce004b4b8b13d3562bf /channels/chan_sip.c
parent7323809607a08ade7e17645a0d07f41dd8daff1d (diff)
chan_sip: keep same local (from) tag for outgoing register requests
For outbound register requests the tag on the From line was updated every 20 seconds prior to a successful registration and also once for each registration renewal. That behavior can possibly cause the registration to be denied because of the different tag, and is not aligned with the intention of RFC 3261 8.1.3.5 "... request constitutes a new transaction and SHOULD have the same value of the Call-ID, To, and From of the previous request...". This updates chan_sip to have a field to keep the local tag in the registration structure and use that tag for registration requests where the callid is also unchanged. (closes issue ASTERISK-12117) Reported by: Pawel Pierscionek Review: https://reviewboard.asterisk.org/r/2988/ ........ Merged revisions 402604 from http://svn.asterisk.org/svn/asterisk/branches/1.8 ........ Merged revisions 402605 from http://svn.asterisk.org/svn/asterisk/branches/11 ........ Merged revisions 402606 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@402607 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels/chan_sip.c')
-rw-r--r--channels/chan_sip.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 3b21d9f37..c56f7c4c9 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -1483,6 +1483,7 @@ 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);
static void build_callid_registry(struct sip_registry *reg, const struct ast_sockaddr *ourip, const char *fromdomain);
+static void build_localtag_registry(struct sip_registry *reg);
static void make_our_tag(struct sip_pvt *pvt);
static int add_header(struct sip_request *req, const char *var, const char *value);
static int add_max_forwards(struct sip_pvt *dialog, struct sip_request *req);
@@ -8759,6 +8760,12 @@ static void build_callid_registry(struct sip_registry *reg, const struct ast_soc
ast_string_field_build(reg, callid, "%s@%s", generate_random_string(buf, sizeof(buf)), host);
}
+/*! \brief Build SIP From tag value for REGISTER */
+static void build_localtag_registry(struct sip_registry *reg)
+{
+ ast_string_field_build(reg, localtag, "as%08lx", ast_random());
+}
+
/*! \brief Make our SIP dialog tag */
static void make_our_tag(struct sip_pvt *pvt)
{
@@ -15396,13 +15403,13 @@ static int transmit_register(struct sip_registry *r, int sipmethod, const char *
return 0;
} else {
p = dialog_ref(r->call, "getting a copy of the r->call dialog in transmit_register");
- make_our_tag(p); /* create a new local tag for every register attempt */
ast_string_field_set(p, theirtag, NULL); /* forget their old tag, so we don't match tags when getting response */
}
} else {
/* Build callid for registration if we haven't registered before */
if (!r->callid_valid) {
build_callid_registry(r, &internip, default_fromdomain);
+ build_localtag_registry(r);
r->callid_valid = TRUE;
}
/* Allocate SIP dialog for registration */
@@ -15411,6 +15418,9 @@ static int transmit_register(struct sip_registry *r, int sipmethod, const char *
return 0;
}
+ /* reset tag to consistent value from registry */
+ ast_string_field_set(p, tag, r->localtag);
+
if (p->do_history) {
append_history(p, "RegistryInit", "Account: %s@%s", r->username, r->hostname);
}