diff options
author | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-02-17 02:07:18 +0000 |
---|---|---|
committer | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-02-17 02:07:18 +0000 |
commit | 24497d568cbf33a6d18df49eb710824d4b534a7b (patch) | |
tree | 5aa4ad534810081a83210f573af8e9100fd0413a /channels | |
parent | 26e283fca812c3643c2e1e0b21a408e03b7355d4 (diff) |
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
........
................
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.1@176461 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r-- | channels/chan_sip.c | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 7a3eb106b..80fcf2624 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -2112,7 +2112,7 @@ static void set_insecure_flags(struct ast_flags *flags, const char *value, int l 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, const char *useragent, int expirey, int deprecated_username); +static void realtime_update_peer(const char *peername, struct sockaddr_in *sin, const char *username, const char *fullcontact, const char *useragent, int expirey, int deprecated_username, int lastms); static void update_peer(struct sip_peer *p, int expire); static struct ast_variable *get_insecure_variable_from_config(struct ast_config *config); static const char *get_name_from_variable(struct ast_variable *var, const char *newpeername); @@ -3736,12 +3736,13 @@ static int sip_sendtext(struct ast_channel *ast, const char *text) 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, const char *useragent, int expirey, int deprecated_username) +static void realtime_update_peer(const char *peername, struct sockaddr_in *sin, const char *defaultuser, const char *fullcontact, const char *useragent, 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; @@ -3753,6 +3754,8 @@ static void realtime_update_peer(const char *peername, struct sockaddr_in *sin, 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)); @@ -3775,6 +3778,9 @@ static void realtime_update_peer(const char *peername, struct sockaddr_in *sin, deprecated_username ? "username" : "defaultuser", defaultuser, syslabel, sysname, SENTINEL); /* 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 */ @@ -3892,7 +3898,7 @@ static void update_peer(struct sip_peer *p, int expire) 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, p->useragent, expire, p->deprecated_username); + realtime_update_peer(p->name, &p->addr, p->username, rtcachefriends ? p->fullcontact : NULL, p->useragent, expire, p->deprecated_username, p->lastms); } } @@ -10357,10 +10363,12 @@ static void destroy_association(struct sip_peer *peer) 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", "", "useragent", "", SENTINEL); - else + ast_update_realtime("sippeers", "name", peer->name, "lastms", "", NULL); + } else { ast_db_del("SIP/Registry", peer->name); + } } } @@ -16332,10 +16340,13 @@ static void handle_response_peerpoke(struct sip_pvt *p, int resp, struct sip_req peer->call = dialog_unref(peer->call, "unref dialog 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_devstate_changed(AST_DEVICE_UNKNOWN, "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); @@ -20682,9 +20693,11 @@ static int sip_poke_noanswer(const void *data) 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) { @@ -21579,6 +21592,8 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, str } } 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")) @@ -21912,9 +21927,17 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, str 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) { + ref_peer(peer, "schedule qualify"); + sip_poke_peer(peer, 0); + } + 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)) |