[svn-commits] tilghman: branch 1.6.0 r176460 - in /branches/1.6.0: ./ channels/chan_sip.c
SVN commits to the Digium repositories
svn-commits at lists.digium.com
Mon Feb 16 20:04:58 CST 2009
Author: tilghman
Date: Mon Feb 16 20:04:58 2009
New Revision: 176460
URL: http://svn.digium.com/svn-view/asterisk?view=rev&rev=176460
Log:
Merged revisions 176459 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk
................
r176459 | tilghman | 2009-02-16 19:58:39 -0600 (Mon, 16 Feb 2009) | 17 lines
Merged revisions 176426 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r176426 | tilghman | 2009-02-16 18:49:22 -0600 (Mon, 16 Feb 2009) | 10 lines
After a 'sip reload', qualifies for realtime peers weren't immediately
restarted, instead waiting until the next registration. We're now
caching the qualify across a reload/restart and starting the qualify
immediately upon loading the peer.
(closes issue #14196)
Reported by: pdf
Patches:
20090120__bug14196_1.4.diff.txt uploaded by pdf (license 663)
Tested by: pdf
........
................
Modified:
branches/1.6.0/ (props changed)
branches/1.6.0/channels/chan_sip.c
Propchange: branches/1.6.0/
------------------------------------------------------------------------------
Binary property 'trunk-merged' - no diff available.
Modified: branches/1.6.0/channels/chan_sip.c
URL: http://svn.digium.com/svn-view/asterisk/branches/1.6.0/channels/chan_sip.c?view=diff&rev=176460&r1=176459&r2=176460
==============================================================================
--- branches/1.6.0/channels/chan_sip.c (original)
+++ branches/1.6.0/channels/chan_sip.c Mon Feb 16 20:04:58 2009
@@ -1957,7 +1957,7 @@
static int handle_common_options(struct ast_flags *flags, struct ast_flags *mask, struct ast_variable *v);
/* Realtime device support */
-static void realtime_update_peer(const char *peername, struct sockaddr_in *sin, const char *username, const char *fullcontact, int expirey, int deprecated_username);
+static void realtime_update_peer(const char *peername, struct sockaddr_in *sin, const char *username, const char *fullcontact, int expirey, int deprecated_username, int lastms);
static struct sip_user *realtime_user(const char *username);
static void update_peer(struct sip_peer *p, int expiry);
static struct ast_variable *get_insecure_variable_from_config(struct ast_config *config);
@@ -3447,12 +3447,13 @@
that name and store that in the "regserver" field in the sippeers
table to facilitate multi-server setups.
*/
-static void realtime_update_peer(const char *peername, struct sockaddr_in *sin, const char *defaultuser, const char *fullcontact, int expirey, int deprecated_username)
+static void realtime_update_peer(const char *peername, struct sockaddr_in *sin, const char *defaultuser, const char *fullcontact, int expirey, int deprecated_username, int lastms)
{
char port[10];
char ipaddr[INET_ADDRSTRLEN];
char regseconds[20];
char *tablename = NULL;
+ char str_lastms[20];
const char *sysname = ast_config_AST_SYSTEM_NAME;
char *syslabel = NULL;
@@ -3464,6 +3465,8 @@
tablename = realtimeregs ? "sipregs" : "sippeers";
+
+ snprintf(str_lastms, sizeof(str_lastms), "%d", lastms);
snprintf(regseconds, sizeof(regseconds), "%d", (int)nowtime); /* Expiration time */
ast_copy_string(ipaddr, ast_inet_ntoa(sin->sin_addr), sizeof(ipaddr));
snprintf(port, sizeof(port), "%d", ntohs(sin->sin_port));
@@ -3481,6 +3484,9 @@
ast_update_realtime(tablename, "name", peername, "ipaddr", ipaddr,
"port", port, "regseconds", regseconds,
deprecated_username ? "username" : "defaultuser", defaultuser, syslabel, sysname, NULL); /* note syslabel _can_ be NULL */
+ /* We cannot do this in the same statement as above, because the lack of
+ * this field could cause the whole statement to fail. */
+ ast_update_realtime("sippeers", "name", peername, "lastms", str_lastms, NULL);
}
/*! \brief Automatically add peer extension to dial plan */
@@ -3599,7 +3605,7 @@
int rtcachefriends = ast_test_flag(&p->flags[1], SIP_PAGE2_RTCACHEFRIENDS);
if (sip_cfg.peer_rtupdate &&
(p->is_realtime || rtcachefriends)) {
- realtime_update_peer(p->name, &p->addr, p->username, rtcachefriends ? p->fullcontact : NULL, expiry, p->deprecated_username);
+ realtime_update_peer(p->name, &p->addr, p->username, rtcachefriends ? p->fullcontact : NULL, expiry, p->deprecated_username, p->lastms);
}
}
@@ -9882,10 +9888,12 @@
char *tablename = (realtimeregs) ? "sipregs" : "sippeers";
if (!sip_cfg.ignore_regexpire) {
- if (peer->rt_fromcontact)
+ if (peer->rt_fromcontact) {
ast_update_realtime(tablename, "name", peer->name, "fullcontact", "", "ipaddr", "", "port", "", "regseconds", "0", peer->deprecated_username ? "username" : "defaultuser", "", "regserver", "", NULL);
- else
+ ast_update_realtime("sippeers", "name", peer->name, "lastms", "", NULL);
+ } else {
ast_db_del("SIP/Registry", peer->name);
+ }
}
}
@@ -15481,10 +15489,13 @@
peer->call = dialog_unref(peer->call);
if (statechanged) {
const char *s = is_reachable ? "Reachable" : "Lagged";
+ char str_lastms[20];
+ snprintf(str_lastms, sizeof(str_lastms), "%d", pingtime);
ast_log(LOG_NOTICE, "Peer '%s' is now %s. (%dms / %dms)\n",
peer->name, s, pingtime, peer->maxms);
ast_device_state_changed("SIP/%s", peer->name);
+ ast_update_realtime("sippeers", "name", peer->name, "lastms", str_lastms, NULL);
manager_event(EVENT_FLAG_SYSTEM, "PeerStatus",
"ChannelType: SIP\r\nPeer: SIP/%s\r\nPeerStatus: %s\r\nTime: %d\r\n",
peer->name, s, pingtime);
@@ -19750,9 +19761,11 @@
peer->pokeexpire = -1;
if (peer->lastms > -1) {
ast_log(LOG_NOTICE, "Peer '%s' is now UNREACHABLE! Last qualify: %d\n", peer->name, peer->lastms);
+ ast_update_realtime("sippeers", "name", peer->name, "lastms", "-1", NULL);
manager_event(EVENT_FLAG_SYSTEM, "PeerStatus", "ChannelType: SIP\r\nPeer: SIP/%s\r\nPeerStatus: Unreachable\r\nTime: %d\r\n", peer->name, -1);
- if (global_regextenonqualify)
+ if (global_regextenonqualify) {
register_peer_exten(peer, FALSE);
+ }
}
if (peer->call)
peer->call = sip_destroy(peer->call);
@@ -20750,6 +20763,8 @@
}
} else if (realtime && !strcasecmp(v->name, "regseconds")) {
ast_get_time_t(v->value, ®seconds, 0, NULL);
+ } else if (realtime && !strcasecmp(v->name, "lastms")) {
+ sscanf(v->value, "%d", &peer->lastms);
} else if (realtime && !strcasecmp(v->name, "ipaddr") && !ast_strlen_zero(v->value) ) {
inet_aton(v->value, &(peer->addr.sin_addr));
} else if (realtime && !strcasecmp(v->name, "name"))
@@ -21063,9 +21078,17 @@
if ((nowtime - regseconds) > 0) {
destroy_association(peer);
memset(&peer->addr, 0, sizeof(peer->addr));
+ peer->lastms = -1;
ast_debug(1, "Bah, we're expired (%d/%d/%d)!\n", (int)(nowtime - regseconds), (int)regseconds, (int)nowtime);
}
}
+
+ /* Startup regular pokes */
+ if (realtime && peer->lastms > 0) {
+ ASTOBJ_REF(peer);
+ sip_poke_peer(peer);
+ }
+
ast_copy_flags(&peer->flags[0], &peerflags[0], mask[0].flags);
ast_copy_flags(&peer->flags[1], &peerflags[1], mask[1].flags);
if (ast_test_flag(&peer->flags[1], SIP_PAGE2_ALLOWSUBSCRIBE))
More information about the svn-commits
mailing list