diff options
-rw-r--r-- | CHANGES | 3 | ||||
-rw-r--r-- | channels/chan_sip.c | 34 | ||||
-rw-r--r-- | configs/sip.conf.sample | 2 |
3 files changed, 33 insertions, 6 deletions
@@ -30,6 +30,9 @@ SIP Changes after T38 is negotiated. This option is disabled by default. * If ATTENDED_TRANSFER_COMPLETE_SOUND is set, the sound will be played to the target of an attended transfer + * Added two new configuration options, "pokegap" and "pokepeers", which allow + finer control over how many peers Asterisk will poke and the gap between them + when all peers need to be poked at the same time. Skinny Changes -------------- diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 520b696ab..7800aff6a 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -491,6 +491,12 @@ static int max_expiry = DEFAULT_MAX_EXPIRY; /*!< Maximum accepted registr static int default_expiry = DEFAULT_DEFAULT_EXPIRY; static int mwi_expiry = DEFAULT_MWI_EXPIRY; +#define DEFAULT_POKE_GAP 100 +#define DEFAULT_POKE_PEERS 1 + +static int global_poke_gap = DEFAULT_POKE_GAP; /*!< Time between our group of peer pokes */ +static int global_poke_peers = DEFAULT_POKE_PEERS; /*!< Number of peers to poke at a given time */ + #define CALLERID_UNKNOWN "Unknown" #define DEFAULT_MAXMS 2000 /*!< Qualification: Must be faster than 2 seconds by default */ @@ -22544,6 +22550,10 @@ static int reload_config(enum channelreloadreason reason) global_min_se = DEFAULT_MIN_SE; global_max_se = DEFAULT_MAX_SE; + /* Peer poking settings */ + global_poke_gap = DEFAULT_POKE_GAP; + global_poke_peers = DEFAULT_POKE_PEERS; + /* Initialize some reasonable defaults at SIP reload (used both for channel and as default for devices */ ast_copy_string(default_context, DEFAULT_CONTEXT, sizeof(default_context)); default_subscribecontext[0] = '\0'; @@ -23001,6 +23011,16 @@ static int reload_config(enum channelreloadreason reason) } else { global_st_refresher = i; } + } else if (!strcasecmp(v->name, "pokegap")) { + if (sscanf(v->value, "%d", &global_poke_gap) != 1) { + ast_log(LOG_WARNING, "Invalid pokegap '%s' at line %d of %s\n", v->value, v->lineno, config); + global_poke_gap = DEFAULT_POKE_GAP; + } + } else if (!strcasecmp(v->name, "pokepeers")) { + if (sscanf(v->value, "%d", &global_poke_peers) != 1) { + ast_log(LOG_WARNING, "Invalid pokepeers '%s' at line %d of %s\n", v->value, v->lineno, config); + global_poke_peers = DEFAULT_POKE_PEERS; + } } } @@ -23675,13 +23695,10 @@ static int sip_get_codec(struct ast_channel *chan) return p->jointcapability ? p->jointcapability : p->capability; } -/*! \brief Send a poke to all known peers - Space them out 100 ms apart - XXX We might have a cool algorithm for this or use random - any suggestions? -*/ +/*! \brief Send a poke to all known peers */ static void sip_poke_all_peers(void) { - int ms = 0; + int ms = 0, num = 0; struct ao2_iterator i; struct sip_peer *peer; @@ -23692,7 +23709,12 @@ static void sip_poke_all_peers(void) while ((peer = ao2_t_iterator_next(&i, "iterate thru peers table"))) { ao2_lock(peer); - ms += 100; + if (num == global_poke_peers) { + ms += global_poke_gap; + num = 0; + } else { + num++; + } AST_SCHED_REPLACE_UNREF(peer->pokeexpire, sched, ms, sip_poke_peer_s, peer, unref_peer(_data, "removing poke peer ref"), unref_peer(peer, "removing poke peer ref"), diff --git a/configs/sip.conf.sample b/configs/sip.conf.sample index 8596bcd3e..86fb47047 100644 --- a/configs/sip.conf.sample +++ b/configs/sip.conf.sample @@ -148,6 +148,8 @@ srvlookup=yes ; Enable DNS SRV lookups on outbound calls ; host to be up in seconds ; Set to low value if you use low timeout for ; NAT of UDP sessions +;pokegap=100 ; Number of milliseconds between each group of peers being poked +;pokepeers=1 ; Number of peers in a group to be poked at the same time ;notifymimetype=text/plain ; Allow overriding of mime type in MWI NOTIFY ;buggymwi=no ; Cisco SIP firmware doesn't support the MWI RFC ; fully. Enable this option to not get error messages |