diff options
-rw-r--r-- | channels/chan_sip.c | 12 | ||||
-rw-r--r-- | channels/sip/include/sip.h | 1 |
2 files changed, 12 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); } diff --git a/channels/sip/include/sip.h b/channels/sip/include/sip.h index 342c87b36..524d4e32d 100644 --- a/channels/sip/include/sip.h +++ b/channels/sip/include/sip.h @@ -1390,6 +1390,7 @@ struct sip_registry { AST_STRING_FIELD(md5secret); /*!< Password in md5 */ AST_STRING_FIELD(callback); /*!< Contact extension */ AST_STRING_FIELD(peername); /*!< Peer registering to */ + AST_STRING_FIELD(localtag); /*!< Local tag generated same time as callid */ ); enum ast_transport transport; /*!< Transport for this registration UDP, TCP or TLS */ int portno; /*!< Optional port override */ |