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/trunk@176459 f38db490-d61c-443f-a65b-d21fe96a405b
This commit is contained in:
parent
27c4fd2856
commit
44235f022f
|
@ -2454,7 +2454,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);
|
static int handle_common_options(struct ast_flags *flags, struct ast_flags *mask, struct ast_variable *v);
|
||||||
|
|
||||||
/* Realtime device support */
|
/* 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 void update_peer(struct sip_peer *p, int expire);
|
||||||
static struct ast_variable *get_insecure_variable_from_config(struct ast_config *config);
|
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);
|
static const char *get_name_from_variable(struct ast_variable *var, const char *newpeername);
|
||||||
|
@ -4125,12 +4125,13 @@ static int sip_sendtext(struct ast_channel *ast, const char *text)
|
||||||
that name and store that in the "regserver" field in the sippeers
|
that name and store that in the "regserver" field in the sippeers
|
||||||
table to facilitate multi-server setups.
|
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 port[10];
|
||||||
char ipaddr[INET_ADDRSTRLEN];
|
char ipaddr[INET_ADDRSTRLEN];
|
||||||
char regseconds[20];
|
char regseconds[20];
|
||||||
char *tablename = NULL;
|
char *tablename = NULL;
|
||||||
|
char str_lastms[20];
|
||||||
|
|
||||||
const char *sysname = ast_config_AST_SYSTEM_NAME;
|
const char *sysname = ast_config_AST_SYSTEM_NAME;
|
||||||
char *syslabel = NULL;
|
char *syslabel = NULL;
|
||||||
|
@ -4142,6 +4143,8 @@ static void realtime_update_peer(const char *peername, struct sockaddr_in *sin,
|
||||||
|
|
||||||
tablename = realtimeregs ? "sipregs" : "sippeers";
|
tablename = realtimeregs ? "sipregs" : "sippeers";
|
||||||
|
|
||||||
|
|
||||||
|
snprintf(str_lastms, sizeof(str_lastms), "%d", lastms);
|
||||||
snprintf(regseconds, sizeof(regseconds), "%d", (int)nowtime); /* Expiration time */
|
snprintf(regseconds, sizeof(regseconds), "%d", (int)nowtime); /* Expiration time */
|
||||||
ast_copy_string(ipaddr, ast_inet_ntoa(sin->sin_addr), sizeof(ipaddr));
|
ast_copy_string(ipaddr, ast_inet_ntoa(sin->sin_addr), sizeof(ipaddr));
|
||||||
snprintf(port, sizeof(port), "%d", ntohs(sin->sin_port));
|
snprintf(port, sizeof(port), "%d", ntohs(sin->sin_port));
|
||||||
|
@ -4164,6 +4167,9 @@ static void realtime_update_peer(const char *peername, struct sockaddr_in *sin,
|
||||||
deprecated_username ? "username" : "defaultuser", defaultuser,
|
deprecated_username ? "username" : "defaultuser", defaultuser,
|
||||||
syslabel, sysname, SENTINEL); /* note syslabel _can_ be NULL */
|
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 */
|
/*! \brief Automatically add peer extension to dial plan */
|
||||||
|
@ -4283,7 +4289,7 @@ static void update_peer(struct sip_peer *p, int expire)
|
||||||
int rtcachefriends = ast_test_flag(&p->flags[1], SIP_PAGE2_RTCACHEFRIENDS);
|
int rtcachefriends = ast_test_flag(&p->flags[1], SIP_PAGE2_RTCACHEFRIENDS);
|
||||||
if (sip_cfg.peer_rtupdate &&
|
if (sip_cfg.peer_rtupdate &&
|
||||||
(p->is_realtime || rtcachefriends)) {
|
(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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11099,10 +11105,12 @@ static void destroy_association(struct sip_peer *peer)
|
||||||
char *tablename = (realtimeregs) ? "sipregs" : "sippeers";
|
char *tablename = (realtimeregs) ? "sipregs" : "sippeers";
|
||||||
|
|
||||||
if (!sip_cfg.ignore_regexpire) {
|
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);
|
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);
|
ast_db_del("SIP/Registry", peer->name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17180,10 +17188,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");
|
peer->call = dialog_unref(peer->call, "unref dialog peer->call");
|
||||||
if (statechanged) {
|
if (statechanged) {
|
||||||
const char *s = is_reachable ? "Reachable" : "Lagged";
|
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",
|
ast_log(LOG_NOTICE, "Peer '%s' is now %s. (%dms / %dms)\n",
|
||||||
peer->name, s, pingtime, peer->maxms);
|
peer->name, s, pingtime, peer->maxms);
|
||||||
ast_devstate_changed(AST_DEVICE_UNKNOWN, "SIP/%s", peer->name);
|
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",
|
manager_event(EVENT_FLAG_SYSTEM, "PeerStatus",
|
||||||
"ChannelType: SIP\r\nPeer: SIP/%s\r\nPeerStatus: %s\r\nTime: %d\r\n",
|
"ChannelType: SIP\r\nPeer: SIP/%s\r\nPeerStatus: %s\r\nTime: %d\r\n",
|
||||||
peer->name, s, pingtime);
|
peer->name, s, pingtime);
|
||||||
|
@ -21636,9 +21647,11 @@ static int sip_poke_noanswer(const void *data)
|
||||||
|
|
||||||
if (peer->lastms > -1) {
|
if (peer->lastms > -1) {
|
||||||
ast_log(LOG_NOTICE, "Peer '%s' is now UNREACHABLE! Last qualify: %d\n", peer->name, peer->lastms);
|
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);
|
manager_event(EVENT_FLAG_SYSTEM, "PeerStatus", "ChannelType: SIP\r\nPeer: SIP/%s\r\nPeerStatus: Unreachable\r\nTime: %d\r\n", peer->name, -1);
|
||||||
if (sip_cfg.regextenonqualify)
|
if (sip_cfg.regextenonqualify) {
|
||||||
register_peer_exten(peer, FALSE);
|
register_peer_exten(peer, FALSE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (peer->call) {
|
if (peer->call) {
|
||||||
|
@ -22550,6 +22563,8 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, str
|
||||||
}
|
}
|
||||||
} else if (realtime && !strcasecmp(v->name, "regseconds")) {
|
} else if (realtime && !strcasecmp(v->name, "regseconds")) {
|
||||||
ast_get_time_t(v->value, ®seconds, 0, NULL);
|
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) ) {
|
} else if (realtime && !strcasecmp(v->name, "ipaddr") && !ast_strlen_zero(v->value) ) {
|
||||||
inet_aton(v->value, &(peer->addr.sin_addr));
|
inet_aton(v->value, &(peer->addr.sin_addr));
|
||||||
} else if (realtime && !strcasecmp(v->name, "name"))
|
} else if (realtime && !strcasecmp(v->name, "name"))
|
||||||
|
@ -22891,9 +22906,17 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, str
|
||||||
if ((nowtime - regseconds) > 0) {
|
if ((nowtime - regseconds) > 0) {
|
||||||
destroy_association(peer);
|
destroy_association(peer);
|
||||||
memset(&peer->addr, 0, sizeof(peer->addr));
|
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);
|
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[0], &peerflags[0], mask[0].flags);
|
||||||
ast_copy_flags(&peer->flags[1], &peerflags[1], mask[1].flags);
|
ast_copy_flags(&peer->flags[1], &peerflags[1], mask[1].flags);
|
||||||
if (ast_test_flag(&peer->flags[1], SIP_PAGE2_ALLOWSUBSCRIBE))
|
if (ast_test_flag(&peer->flags[1], SIP_PAGE2_ALLOWSUBSCRIBE))
|
||||||
|
|
Reference in New Issue