chan_sip: Allow Asterisk to retry after 403 on register

This adds a global option in chan_sip to allow it to continue
attempting registration if a 403 is received, clearing the cached nonce
and treating it as a non-fatal response. Normally, this would cause
registration attempts to that endpoint to stop.

(closes issue ASTERISK-17138)
Review: https://reviewboard.asterisk.org/r/2874/
Reported by: Rudi
........

Merged revisions 400137 from http://svn.asterisk.org/svn/asterisk/branches/1.8


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/11@400140 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Kinsey Moore
2013-09-30 15:26:39 +00:00
parent ecdd1e76eb
commit fb1c96baf4
3 changed files with 11 additions and 0 deletions

View File

@@ -26,6 +26,9 @@ From 11.5 to 11.6:
returning RESULT_SUCCESS even if there was an error. returning RESULT_SUCCESS even if there was an error.
* The libuuid development library is now optional for res_rtp_asterisk. If the * The libuuid development library is now optional for res_rtp_asterisk. If the
library is not present when building ICE and TURN support will not be present. library is not present when building ICE and TURN support will not be present.
* The option "register_retry_403" has been added to chan_sip to work around
servers that are known to erroneously send 403 in response to valid
REGISTER requests and allows Asterisk to continue attepmting to connect.
From 11.4 to 11.5: From 11.4 to 11.5:
* The default settings for chan_sip are now overriden properly by the general * The default settings for chan_sip are now overriden properly by the general

View File

@@ -770,6 +770,7 @@ static int global_rtpholdtimeout; /*!< Time out call if no RTP during hold */
static int global_rtpkeepalive; /*!< Send RTP keepalives */ static int global_rtpkeepalive; /*!< Send RTP keepalives */
static int global_reg_timeout; /*!< Global time between attempts for outbound registrations */ static int global_reg_timeout; /*!< Global time between attempts for outbound registrations */
static int global_regattempts_max; /*!< Registration attempts before giving up */ static int global_regattempts_max; /*!< Registration attempts before giving up */
static int global_reg_retry_403; /*!< Treat 403 responses to registrations as 401 responses */
static int global_shrinkcallerid; /*!< enable or disable shrinking of caller id */ static int global_shrinkcallerid; /*!< enable or disable shrinking of caller id */
static int global_callcounter; /*!< Enable call counters for all devices. This is currently enabled by setting the peer static int global_callcounter; /*!< Enable call counters for all devices. This is currently enabled by setting the peer
* call-limit to INT_MAX. When we remove the call-limit from the code, we can make it * call-limit to INT_MAX. When we remove the call-limit from the code, we can make it
@@ -20683,6 +20684,7 @@ static char *sip_show_settings(struct ast_cli_entry *e, int cmd, struct ast_cli_
ast_cli(a->fd, " Sub. max duration: %d secs\n", max_subexpiry); ast_cli(a->fd, " Sub. max duration: %d secs\n", max_subexpiry);
ast_cli(a->fd, " Outbound reg. timeout: %d secs\n", global_reg_timeout); ast_cli(a->fd, " Outbound reg. timeout: %d secs\n", global_reg_timeout);
ast_cli(a->fd, " Outbound reg. attempts: %d\n", global_regattempts_max); ast_cli(a->fd, " Outbound reg. attempts: %d\n", global_regattempts_max);
ast_cli(a->fd, " Outbound reg. retry 403:%d\n", global_reg_retry_403);
ast_cli(a->fd, " Notify ringing state: %s\n", AST_CLI_YESNO(sip_cfg.notifyringing)); ast_cli(a->fd, " Notify ringing state: %s\n", AST_CLI_YESNO(sip_cfg.notifyringing));
if (sip_cfg.notifyringing) { if (sip_cfg.notifyringing) {
ast_cli(a->fd, " Include CID: %s%s\n", ast_cli(a->fd, " Include CID: %s%s\n",
@@ -31390,6 +31392,7 @@ static int reload_config(enum channelreloadreason reason)
sip_cfg.compactheaders = DEFAULT_COMPACTHEADERS; sip_cfg.compactheaders = DEFAULT_COMPACTHEADERS;
global_reg_timeout = DEFAULT_REGISTRATION_TIMEOUT; global_reg_timeout = DEFAULT_REGISTRATION_TIMEOUT;
global_regattempts_max = 0; global_regattempts_max = 0;
global_reg_retry_403 = 0;
sip_cfg.pedanticsipchecking = DEFAULT_PEDANTIC; sip_cfg.pedanticsipchecking = DEFAULT_PEDANTIC;
sip_cfg.autocreatepeer = DEFAULT_AUTOCREATEPEER; sip_cfg.autocreatepeer = DEFAULT_AUTOCREATEPEER;
global_autoframing = 0; global_autoframing = 0;
@@ -31777,6 +31780,8 @@ static int reload_config(enum channelreloadreason reason)
} }
} else if (!strcasecmp(v->name, "registerattempts")) { } else if (!strcasecmp(v->name, "registerattempts")) {
global_regattempts_max = atoi(v->value); global_regattempts_max = atoi(v->value);
} else if (!strcasecmp(v->name, "register_retry_403")) {
global_reg_retry_403 = ast_true(v->value);
} else if (!strcasecmp(v->name, "bindaddr") || !strcasecmp(v->name, "udpbindaddr")) { } else if (!strcasecmp(v->name, "bindaddr") || !strcasecmp(v->name, "udpbindaddr")) {
if (ast_parse_arg(v->value, PARSE_ADDR, &bindaddr)) { if (ast_parse_arg(v->value, PARSE_ADDR, &bindaddr)) {
ast_log(LOG_WARNING, "Invalid address: %s\n", v->value); ast_log(LOG_WARNING, "Invalid address: %s\n", v->value);

View File

@@ -774,6 +774,9 @@ srvlookup=yes ; Enable DNS SRV lookups on outbound calls
; 0 = continue forever, hammering the other server ; 0 = continue forever, hammering the other server
; until it accepts the registration ; until it accepts the registration
; Default is 0 tries, continue forever ; Default is 0 tries, continue forever
;register_retry_403=yes ; Treat 403 responses to registrations as if they were
; 401 responses and continue retrying according to normal
; retry rules.
;----------------------------------------- OUTBOUND MWI SUBSCRIPTIONS ------------------------- ;----------------------------------------- OUTBOUND MWI SUBSCRIPTIONS -------------------------
; Asterisk can subscribe to receive the MWI from another SIP server and store it locally for retrieval ; Asterisk can subscribe to receive the MWI from another SIP server and store it locally for retrieval